6

我玩过精灵套件并使用更新方法来设置要处理的每个时间步骤。我正在尝试使用场景工具包快速学习一些东西,但似乎找不到等价物。

你能指出一个为 SceneKit 实现更新方法的例子吗?谢谢。

4

1 回答 1

16

(是的,我知道这个问题是关于SceneKit,而不是 SpriteKit,但它涉及到两个框架之间的共性和差异,所以我将在这个答案中解决这些问题。)

在 SpriteKit 中,游戏循环方法(updatedidSimulatePhysics等)最初是场景类的一部分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,请执行以下操作:

  1. 将您的一个自定义对象(例如,视图控制器)设置delegate为您的SCNView实例。

  2. 在该自定义类中,实现以下方法:

    func renderer(_ aRenderer: SCNSceneRenderer!, updateAtTime time: NSTimeInterval) {
        // per-frame code here
    }
    

SCNSceneRendererDelegate或者,如果您的每帧逻辑需要在处理完动作或物理之后发生,则对其他方法执行类似操作。

于 2014-06-27T21:49:49.250 回答