- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个玩家可以在其中移动的 SceneKit 3D 迷宫世界。跳跃等一些 Action 涉及上下移动相机,同时在几秒钟的时间内改变观察方向。在此期间,我想忽略用户的点击和滑动,这些点击和滑动通常会导致其他类型的移动,例如转身和前进。
我可以创建一个与跳跃持续时间相匹配的计时器并设置一个 bool 值,但我希望有一种更简单的方法来检查相机的 SCNNode。
是否有一种简单的方法来查看相机的 SCNNode 是否不再运行用于跳跃的 SCNAction,以便我可以在其他点击和滑动操作之前添加此逻辑?
或者也许有一个 SCNAction 可以设置 Bool,我可以把它放在我的跳跃序列的开始和结束处?
这是我的跳转代码:
let jumpUp: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), jumpHeight), duration: jumpTime)
let jumpAppex: SCNAction = SCNAction.wait(duration: jumpWaitTime)
let fallDown: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), cameraHeight), duration: jumpTime)
var lookDown: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(π), duration: jumpTurnTime)
let noLook: SCNAction = SCNAction.wait(duration: jumpTime*2.0)
var lookBack: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: 0, duration: jumpTurnTime)
switch playerDirection.direction
{
case .south:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
case .north:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(northZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(northZ), duration: jumpTurnTime)
case .east:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(eastZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(eastZ), duration: jumpTurnTime)
case .west:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(westZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(westZ), duration: jumpTurnTime)
}
let sequenceJump = SCNAction.sequence([jumpUp, jumpAppex, fallDown])
let sequenceLook = SCNAction.sequence([lookDown, noLook, lookBack])
mazeScene.mazeCamera.runAction(sequenceJump)
mazeScene.mazeCamera.runAction(sequenceLook)
谢谢
格雷格
最佳答案
我认为 Action 是很奇怪的东西。
这个想法深受 cocos2D 的启发(基本上是 1:1 映射和“窃取”),在 cocos2D 中,它们被用作避免与游戏循环、状态和时间(某种程度上)直接交互的一种方式。 Action 提供了一种模块化和抽象,用于处理时间以及事件的创建和调用,以及对其结论的非常原始的处理。
阅读此处时,您可以看到 SpriteKit 和 SceneKit 的 Actions 与原始想法有多么相似:http://python.cocos2d.org/doc/programming_guide/actions.html
由于它们的创造具有不同和不断发展的性质,有人忘记让它们了解自己的状态,尽管它们会影响节点状态的某些方面。如果 Action 对象具有“运行”状态,这将近乎完美。但据我所知,他们没有。
相反,您可以检查节点是否具有给定的操作,如果有,则推断该操作正在运行。
尽管大多数操作在一段时间内做某事,但您也无法查询它们在持续时间内完成了多远,也无法查询它们刚刚触发或接下来将发送的值。但是有一些操作可以做到这一点,特别是为了应对所有操作都缺少这个的事实,这意味着如果你想要这个,你需要使用一个特殊的操作来提供这个。
而这种本应与生俱来的设施的递归和返回 self 是操作中最令人讨厌的部分,没有从熟悉时间轴和关键帧的人的角度考虑。
整体而言,总而言之:您无法查询操作的状态,也无法查询其进度,也无法查询它刚刚执行或将要使用的值。这绝对是荒谬的。
我不知道这在 Actions 的各种演变中是如何被忽视的……他们是时间管理和模块化事件的创造者。在其中包含状态和进度报告似乎是合乎逻辑的……好吧,我不知道……奇怪的是他们没有。
所以,回答你的问题:
您可以使用完成处理程序(当 Action 完成时调用一些代码)来设置值或调用其他函数或清理内容,或者任何您想要的。
序列操作,在 SCNAction.sequence 中...这是一种让操作按顺序运行的方法,并在内部使用一些操作,这些操作在您需要时运行代码块,调用设置您需要的内容,当你需要的时候,按照 Action 的顺序。如果 Actions 当前具有的时间和属性的值是透明的,那么所有这些都可以避免……但是……
您还可以使用一些特殊操作,这些操作通过对它们所做的更改来了解它们正在编辑的值。我只熟悉 SKEaseKit 中的 float 设置能力,但你可能可以在 SceneKit 和 SpriteKit 中做到这一点(如果你比我更擅长编码)。 SKEaseKit 隐藏了几个非常有用的值更改操作。
我使用它,例如,像这样,其中这个困惑在持续时间(时间)内将值从 0 更改为 1,在这种情况下是线性的,并且每个帧(希望如此)更新节点的 .xScale这个 growAction 运行:
let growAction = SKEase.createFloatTween(
start: 0,
ender: 1,
timer: time,
easer: SKEase.getEaseFunction(.curveTypeLinear,
easeType: .easeTypeOut),
setterBlock: {(node, i) in
node.xScale = i}
)
关于ios - 检查 SCNNode SCNAction 是否完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929527/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!