Apple Engine

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

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 クラスの中身を見てゆく