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)
}
}
次回はクリア時の表示、レンダリングのクオリティ設定の関数について見てゆく。