WWDC 2017 の SceneKit サンプル Fox 2 を調べる その24
GameController クラスのセットアップ関数を見てゆく。
量が多いため何回かに分ける予定。
セットアップ
GameController クラスのイニシャライズ時にいくつかの関数が呼ばれる。
setupGameController()
ゲームコントローラー設定。
Bluetooth で接続や切断されるため、NotificationCenter の addObserver で接続状態と切断状態を監視する。
接続されれば、GameController で設定している handleControllerDidConnect 関数が呼ばれ、切断されれば handleControllerDidDisconnect が呼ばれゲームコントローラーでの操作の処理が行われる。
イニシャライズ時に setupGameController() が呼ばれ、ゲームコントローラーがすでに接続されている場合は、このファイルの最後の方にある registerGameController 関数が呼ばれゲームコントローラーが使用できるよう処理をする。
func setupGameController() {
NotificationCenter.default.addObserver(
self, selector: #selector(self.handleControllerDidConnect),
name: NSNotification.Name.GCControllerDidConnect, object: nil)
NotificationCenter.default.addObserver(
self, selector: #selector(self.handleControllerDidDisconnect),
name: NSNotification.Name.GCControllerDidDisconnect, object: nil)
guard let controller = GCController.controllers().first else {
return
}
registerGameController(controller)
}
setupCharacter()
プレイヤーキャラクター Max の設定。
クラス内の変数 character に Character クラスを scene と共に渡す。
キャラクターは物理判定を行うため、キャラクターの physicsWorld にシーンの physicsWorld の設定を渡す。
character の中身の Character クラスにある node の返り値から、Character クラスで設定した Max のノードを返す。 そのノードを addChildNode して GameController のシーンの追加する。
func setupCharacter() {
character = Character(scene: scene!)
character!.physicsWorld = scene!.physicsWorld
scene!.rootNode.addChildNode(character!.node!)
}
setupPhysics()
物理シミュレーション設定。
enumerateHierarchy で階層の全てのノードを調べ Physics Body の collisionBitMask へ character のビットマスクを渡す。
func setupPhysics() {
self.scene?.rootNode.enumerateHierarchy({(_ node: SCNNode, _ _: UnsafeMutablePointer<ObjCBool>) -> Void in
node.physicsBody?.collisionBitMask = Int(Bitmask.character.rawValue)
})
}
setupCollisions()
障害物の判定のノードを設定する。
collision.scn を読み込み、階層の全てのノードを調べる。
見つかった全ての透明度を 0 にして、そのノードを addChildNode して GameController のシーンの追加する。
func setupCollisions() {
let collisionsScene = SCNScene( named: "Art.scnassets/collision.scn" )
collisionsScene!.rootNode.enumerateChildNodes { (_ child: SCNNode, _ _: UnsafeMutablePointer<ObjCBool>) in
child.opacity = 0.0
self.scene?.rootNode.addChildNode(child)
}
}
次回は GameController クラスのカメラ設定を見てゆく。