物理模拟的SceneKit更新方法

时间:2014-06-27 18:44:08

标签: xcode swift ios8 scenekit

我玩过sprite kit并使用了update方法设置每个时间步处理的东西。我试图学习一些快速的场景工具包,但似乎找不到相应的东西。

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

1 个答案:

答案 0 :(得分:14)

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

在SpriteKit中,游戏循环方法(updatedidSimulatePhysics等)最初是场景类SKScene的一部分。然而,这并不总是最好的想法 - 您可能希望将场景实例视为更像数据而非实现游戏逻辑的场所(特别是现在可以在Xcode 6图形场景编辑器中完全构建场景)。所以在iOS 8和OS X Yosemite中,这些方法分为两个方面。如果您已经为每帧游戏逻辑继承了SKScene,那么您可以继续这样做。但是如果您宁愿将该代码放在别处,可以在场景中设置委托,并在那里实现等效的SKSceneDelegate方法。

SceneKit有更多的关注点分离。 SCNScene更接近于纯粹的数据模型对象,以及由负责显示场景的视图(或其他对象)管理的所有渲染循环功能。通常,您在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
    }
    
  3. 如果在处理动作或物理后需要发生每帧逻辑,则对其他SCNSceneRendererDelegate方法执行类似操作。