Appearance
第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()として決まっている