SpriteKitで作ったインベーダーゲームの状態遷移

前回はゲーム画面を構成するパーツの話でした。今回はゲームをしている時の状態遷移について簡単にメモしておきます。

ゲーム中に使われている状態

ゲーム中の状態は GameState で表され InvaderGameController で以下のように定義されています。

enum GameState: Int {
    case prepareStage = 0, placeInvader, gaming, playerDead, playerRestart, stageClear, gameEnd, idle
}

GameScene が初期化された後、ゲームが始まってから終了するまでゲームは上記の状態のどれかになっており、以下のように遷移します。

以下、GameScene の初期化も含めそれぞれのステートについて簡単に説明します。

init

GameState では定義していない状態で、InvaderGameController が作られた時に一度きり行われます。行なっている内容は以下の通りです。

  • Player のインスタンスの作成
  • 全ての Invader のインスタンスの作成
  • 全てのトーチカのインスタンスの作成
  • UFO のインスタンスの作成
  • 画面表示スプライトの作成
  • 地面の SKShapeNode の作成

以上を行なってステートを prepareStage にするとステージの準備が始まります。

prepareStage

ステージの準備をします。内容は以下の通り。

  • 自機の準備(Player の状態をリセットして GameScene に addChild する)
  • トーチカの準備(全てのトーチカを GameScene からremoveFromParent して addChild する)
  • インベーダーの準備(位置情報などの状態をリセット)
  • 画面表示情報のアップデート

以上を行なってステートを placeInvader にします。

placeInvader

インベーダーを GameScene にフレーム毎に1匹づつ addChild します。
全て add するとステートを gaming にします。

gaming

ゲームをしている状態です。

  • 音を鳴らして
  • 自機の移動、弾の発射
  • インベーダーの移動、弾の発射
  • UFO の出現

以上を行います。状態が変わるのは以下の2つの時です。

  • 全てのインベーダーを倒した時(stageClear へ)
  • 自機がやられた時(playerDead へ)
playerDead

自機がやられた時にこのステートになります。
が、すぐに残機の数によって playerRestart か gameEnd にステートが変わります。

playerRestart

自機がやられてもまだ残りの自機がある場合にこのステートになります。
2秒間待ってステートを gaming にし、ゲームの続きが始まります。

gameEnd

自機がやられて残りの自機がない場合にこのステートになります。
GAME OVER と表示して4秒間待ってからデモ画面へ移動します。

stageClear

全てのインベーダーを倒すと stageClear ステートになります。
このステートではまだ自機を動かすことができます。(インベーダーがやられる直前に撃った弾を避けられるようにするため)
1秒間待ってステートは preparStage に移行します。

最後に

今回はゲームの状態遷移についての簡単な説明でした。簡単なゲームなので状態の数も少ないです。強いて言えば PlaceInvader でインベーダーを1匹づつ配置する部分が特別?かな。

ちなみにデモの画面については特に状態というものは用意していません。動作のリストのようなものを順次実行しているだけです。これについてはいつかメモするつもりです。

次回は各オブジェクトの簡単な説明の予定です。

Leave a Reply

Your email address will not be published. Required fields are marked *