Apple Engine

Apple, iPhone, iOS, その周辺のことについて

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)
    }
}

 

次回はクリア時の表示、レンダリングのクオリティ設定の関数について見てゆく。