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 クラス のセットアップの関数を見てゆく。