Skip to content
第07回 ゲームの状態と終了条件

2 / 4 状態遷移を集約する

このステップの目的

状態が変わる瞬間の処理をChangeState()へ集め、画面とゲーム進行をそろえる

状態を直接書き換えない

Gameの複数の場所からstate = ...を直接行うと、状態へ入ったときの処理が分散します。 そこで、状態変更をChangeState()へ集めます。

Game.cppcpp
void Game::ChangeState(State nextState)
{
    state = nextState;
}

タイトルで決定入力を受けたときはStartGame()からPlayingへ移ります。 プレイ中にHPが0になったときはGameOverへ、得点または制限時間の条件を満たしたときはGameClearへ移ります。

遷移条件を見つけたら、状態変数を直接変更せずChangeState()を呼び出します。

Game.cppcpp
if (!player.IsAlive())
{
    ChangeState(State::GameOver);
    return;
}

if (score >= tuning::game::ClearScore || timeLeft <= 0.0f)
{
    ChangeState(State::GameClear);
    return;
}

入った状態の処理を同じ場所へ置く

状態へ入ったときのBGMやSEは、第09回で音声を追加するときもこの関数へ接続します。 今は画面上の状態変更だけを確認し、音声の読み込みの説明を前倒ししません。

チェックリスト
  • 状態の変更をChangeState()へ集約している
  • タイトル、プレイ、クリア、ゲームオーバーの遷移条件が明確である
  • 次回の音声追加位置がChangeState()として決まっている