Apple Engine

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

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