物理模拟的SceneKit更新方法

Che*_*ees 6 xcode scenekit swift ios8

我玩过精灵套件,并使用更新方法设置每个时间步骤处理的东西.我正试图学习一些快速的场景套件,似乎无法找到相应的.

你能指点一下为SceneKit实现更新方法的例子吗?谢谢.

ric*_*ter 14

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

在SpriteKit,游戏循环的方法(update,didSimulatePhysics等)最初的场景类的一部分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
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 它不是任何特定子类的覆盖方法 - 请参阅已编辑的答案. (2认同)