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 クラスのカメラ設定を見てゆく。