我玩过精灵套件并使用更新方法来设置要处理的每个时间步骤。我正在尝试使用场景工具包快速学习一些东西,但似乎找不到等价物。
你能指出一个为 SceneKit 实现更新方法的例子吗?谢谢。
(是的,我知道这个问题是关于SceneKit,而不是 SpriteKit,但它涉及到两个框架之间的共性和差异,所以我将在这个答案中解决这些问题。)
在 SpriteKit 中,游戏循环方法(update
、didSimulatePhysics
等)最初是场景类的一部分SKScene
。不过,这并不总是最好的想法——您可能希望将场景实例更像是数据而不是实现游戏逻辑的地方(尤其是现在场景可以完全在 Xcode 6 图形场景编辑器中构建)。所以在 iOS 8 和 OS X Yosemite 中,这些方法在两个地方。如果您已经SKScene
为每帧游戏逻辑子类化,您可以继续这样做。但是,如果您希望将该代码放在其他地方,您可以在场景中设置一个委托,并在SKSceneDelegate
那里实现等效的方法。
SceneKit 有更多的关注点分离。AnSCNScene
更接近于纯数据模型对象,并且所有渲染循环功能都由负责显示场景的视图(或其他对象)管理。通常你会在一个场景中显示一个场景SCNView
——但也有其他类可以渲染场景,所以它们的通用 API 可以在SCNSceneRenderer
协议中找到。使用该delegate
协议定义的属性为您的视图设置委托,并且在您的委托中,您可以实现SCNSceneRendererDelegate
方法以参与渲染循环的关键阶段。
SceneKit 循环阶段几乎直接对应于 SpriteKit 中的循环阶段:update:
变为renderer:updateAtTime:
、didEvaluateActions:
变为renderer:didApplyAnimationsAtTime:
(因为它包括 CoreAnimation 风格的动画以及 SpriteKit 风格的动作)等。
因此,对于与 SpriteKit 每帧update
方法等效的 SceneKit,请执行以下操作:
将您的一个自定义对象(例如,视图控制器)设置delegate
为您的SCNView
实例。
在该自定义类中,实现以下方法:
func renderer(_ aRenderer: SCNSceneRenderer!, updateAtTime time: NSTimeInterval) {
// per-frame code here
}
SCNSceneRendererDelegate
或者,如果您的每帧逻辑需要在处理完动作或物理之后发生,则对其他方法执行类似操作。