Apple Engine

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

WWDC 2017 の SceneKit サンプル Fox 2 を調べる その23

今回から何回かに分けて GameController クラスの中身をみてゆく。

 

クラスの宣言

NSObject としてクラスをつくり、先に設定した ExtraProtocols で各 delegate の宣言をしている。

class GameController: NSObject, ExtraProtocols {
    ...
}

 

 

定数 / 変数

クラス内で使い回せるように宣言されている

 

全体設定

定数,変数名 説明
DefaultCameraTransitionDuration カメラ切り替えのアニメーション速度
NumberOfFiends 助け出す仲間の数
CameraOrientationSensitivity カメラ回転の際の向き感度
static let DefaultCameraTransitionDuration = 1.0
static let NumberOfFiends = 100
static let CameraOrientationSensitivity: Float = 0.05

 

定数,変数名 説明
scene scene.scn やその他設定を適応する SCNScene
sceneRenderer SCNSceneRendererDelegate 設定用の SCNSceneRenderer
private var scene: SCNScene?
private weak var sceneRenderer: SCNSceneRenderer?

 

オーバーレイ

画面左上 Max、宝石、鍵アイコンなど画面最全面に配置される SpriteKit でつくられた 2D UI 設定。
クリア時の出る Max のロゴと「Congratulations」の文字も。

Overlay.swift の Overlay クラスが設定される。

private var overlay: Overlay?

 

プレイヤーキャラクター(Max)

プレイヤーキャラクター設定。
Character.swift の Character クラスが設定される。

private var character: Character?

 

カメラとターゲット

定数,変数名 説明
cameraNode カメラのノード
lookAtTarget Max の Y 軸移動を固定したコンストレイントを持つノード
lastActiveCamera 最後に設定されたカメラ
lastActiveCameraFrontDirection 最後に設定されたカメラの前方向のベクトル
activeCamera 現在使用しているアクティブなカメラ
playingCinematic 操作できるかのフラグ。クリアすると true になると操作を止める
private var cameraNode = SCNNode()
private var lookAtTarget = SCNNode()
private var lastActiveCamera: SCNNode?
private var lastActiveCameraFrontDirection = simd_float3.zero
private var activeCamera: SCNNode?
private var playingCinematic: Bool = false

 

トリガー

透明度 0 の四角であるトリガーに Max が触れるとカメラの視点が変わる。 そのトリガー設定

定数,変数名 説明
lastTrigger 最後に接触したトリガーを格納する
firstTriggerDone 現在のトリガーと lastTrigger が同じである場合アニメーションさせないためのフラグ
private var lastTrigger: SCNNode?
private var firstTriggerDone: Bool = false

 

敵キャラ

Max が近づくと追いかける敵 enemy1 と 遠ざかる敵 enemy2 を設定するノード。

private var enemy1: SCNNode?
private var enemy2: SCNNode?

 

助け出す仲間の設定

定数,変数名 説明
friends 仲間を設定した SCNode が入った配列
friendsSpeed 各仲間の歩行スピード
friendCount 各仲間のカウント用変数
friendsAreFree 仲間を助けた時に true になるフラグ
private var friends = [SCNNode](repeating: SCNNode(), count: NumberOfFiends)
private var friendsSpeed = [Float](repeating: 0.0, count: NumberOfFiends)
private var friendCount: Int = 0
private var friendsAreFree: Bool = false

 

アイテム設定

定数,変数名 説明
collectedKeys 鍵を所持しているか判別する変数
collectedGems 宝石を所持しているか判別する変数
keyIsVisible 鍵がステージ内に表示されているか判別するフラグ
private var collectedKeys: Int = 0
private var collectedGems: Int = 0
private var keyIsVisible: Bool = false

 

パーティクル

パーティクルシステムを格納する配列。
グローバルで宣言されているパーティクル用の enum で設定する。

private var particleSystems = [[SCNParticleSystem]](repeatElement([SCNParticleSystem()], count: ParticleKind.totalCount.rawValue))

 

オーディオ

Sound Effect などのオーディオを格納する配列。
グローバルで宣言されているオーディオ用の enum で設定する。

private var audioSources = [SCNAudioSource](repeatElement(SCNAudioSource(), count: AudioSourceKind.totalCount.rawValue))

 

GameplayKit

GameplayKit の GKComponent の大元 GKScene を設定する。

private var gkScene: GKScene?

 

Game controller

Lightning もしくは Bluetooh で接続するゲームコントローラーを扱う GCController の設定。

定数,変数名 説明
gamePadCurrent 現在の使用している GCController(ゲームコントローラー)
gamePadLeft 左側のパッド(移動用)
gamePadRight 右側のパッド(視点回転用)
private var gamePadCurrent: GCController?
private var gamePadLeft: GCControllerDirectionPad?
private var gamePadRight: GCControllerDirectionPad?

 

経過時間

lastUpdateTime に経過時間を設定する。
フレーム毎に更新される SceneRenderer から GKComponent などの update 関数を呼ぶために使う。

private var lastUpdateTime = TimeInterval()

 

次回は GameController クラス のセットアップの関数を見てゆく。