WWDC 2017 の SceneKit サンプル Fox 2 を調べる その33
引き続き GameController クラスの残りの関数を見てゆく。
今回はフレーム毎に更新される関数について。
Fox2 で使用しているフレーム毎に更新される関数
GameController のプロトコルで設定している様に SCNSceneRenderer と SCNPhysicsContact の2つのデリゲートが行なっている。
SCNSceneRendererDelegate
フレーム毎の描画更新で呼ばれる関数。
以下、行われる内容。
- deltaTime で現在の経過時間を保持し、lastUpdateTime で最終に取得した経過時間を保持する
- friendsAreFree が true なら updateFriends 呼び、仲間が解放され歩行するアニメーションを開始する。
- playingCinematic が true ならこれ以降の処理を飛ばす
- character クラスの update を呼び状態を更新する
- 全ての GKEntity の update 関数を更新する
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { if lastUpdateTime == 0 { lastUpdateTime = time } let deltaTime: TimeInterval = time - lastUpdateTime lastUpdateTime = time if friendsAreFree { updateFriends(deltaTime: deltaTime) } if playingCinematic == true { return } character!.update(atTime: time, with: renderer) for entity: GKEntity in gkScene!.entities { entity.update(deltaTime: deltaTime) } }
SCNPhysicsContactDelegate
フレーム毎の物理判定で呼ばれる関数
以下、行われる内容。
- nodeA, nodeB の categoryBitMask が Bitmask.trigger であった場合、trigger 関数に該 当するノードを渡し関数を呼び出す。
- nodeA, nodeB の categoryBitMask が Bitmask.collectable であった場合、collect 関数に該当するノードを渡し関数を呼び出す。
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { if contact.nodeA.physicsBody!.categoryBitMask == Bitmask.trigger.rawValue { trigger(contact.nodeA) } if contact.nodeB.physicsBody!.categoryBitMask == Bitmask.trigger.rawValue { trigger(contact.nodeB) } if contact.nodeA.physicsBody!.categoryBitMask == Bitmask.collectable.rawValue { collect(contact.nodeA) } if contact.nodeB.physicsBody!.categoryBitMask == Bitmask.collectable.rawValue { collect(contact.nodeB) } }
次回はクリア時の表示、レンダリングのクオリティ設定の関数について見てゆく。