WWDC 2017 の SceneKit サンプル Fox 2 を調べる その22
Fox2 のサンプルで中心的なクラス GameController がある GameController.swift について見てゆく。
GameController.swift は GameController クラス、設定用にグローバルの struct と enum、各プラットフォーム毎に GameController の宣言時で読み込むプロトコルをつくり変えている。
GameController クラスは NSObject であり、以下、プロトコルでのデリゲートの呼び出しを内容。
- SCNSceneRendererDelegate
- SCNPhysicsContactDelegate
- PadOverlayDelegate (iOS 用 ヴァーチャルパッドのパッド)
- ButtonOverlayDelegate (iOS 用 ヴァーチャルパッドのボタン)
- MenuDelegate (WWDC 2017 デモ用のデバッグメニュー)
また、GameController クラスはイニシャライズ時に各プラットフォームで設定されている SCNView が参照渡しされ、
イニシャライズ関数の中で渡された SCNView に対して SCNScene を適応したり、SCNSceneRendererDelegate を設定したりしている。
GameController.swift の初期設定
import
SceneKit、GameController クラスで GKComponent が呼び出されているため GameplayKit、ゲームコントローラーの対応のため GameController がインポートされている。
import GameController import GameplayKit import SceneKit
struct Bitmask
物理判定用のコリジョンのビットマスクが設定された構造体。すでに紹介しているプレイヤーキャラクター Max の設定がある Character.swift などでも使用されている。
また rawValue が設定されており、Int で返すようになっている。
名前 | 説明 |
---|---|
character | Max の物理判定 |
collision | 背景の物理判定 |
enemy | 敵の物理判定 |
trigger | カメラ切り替えなどで使う透明な四角の領域の物理判定 |
collectable | 取得アイテムである宝石や鍵の物理判定 |
struct Bitmask: OptionSet { let rawValue: Int static let character = Bitmask(rawValue: 1 << 0) static let collision = Bitmask(rawValue: 1 << 1) static let enemy = Bitmask(rawValue: 1 << 2) static let trigger = Bitmask(rawValue: 1 << 3) static let collectable = Bitmask(rawValue: 1 << 4) }
typealias ExtraProtocols
GameController クラスで使用するプロトコルを typealias として ExtraProtocols で設定している。
iOS の場合 PadOverlayDelegate と ButtonOverlayDelegate が必要なため、#if を使用して判別している。
#if os( iOS ) typealias ExtraProtocols = SCNSceneRendererDelegate & SCNPhysicsContactDelegate & MenuDelegate & PadOverlayDelegate & ButtonOverlayDelegate #else typealias ExtraProtocols = SCNSceneRendererDelegate & SCNPhysicsContactDelegate & MenuDelegate #endif
enum ParticleKind
パーティクルの配列の判別用に enum で添字を設定している
enum ParticleKind: Int { case collect = 0 case collectBig case keyApparition case enemyExplosion case unlockDoor case totalCount }
enum AudioSourceKind
オーディオ再生の配列の判別用に enum で添字を設定している
enum AudioSourceKind: Int { case collect = 0 case collectBig case unlockDoor case hitEnemy case totalCount }
次回は GameController クラスの中身を見てゆく