第07回 ゲームの状態と終了条件
3 / 4 ゲームをリセットして再挑戦する
このステップの目的
各クラスのResetをまとめて呼び、結果画面からゲームを再開します。
開始状態へ戻す
Game.hのprivateへ、StartGame、ChangeState、UpdateResult、DrawResultの宣言を追加してください。引数の有無は次の実装とそろえます。各オブジェクトを初期状態へ戻す処理には、既存のResetを引き続き使います。
Game.cppcpp
void Game::StartGame()
{
// 前回の結果を残さず、全オブジェクトを開始状態へ戻す
player.Reset();
playerShots.Reset();
enemies.Reset();
enemyShots.Reset();
timeLeft = tuning::game::TimeLimit;
score = 0;
ChangeState(State::Playing);
}Gameは自機・弾・敵と、得点・残り時間をリセットしてPlayingへ移ります。
結果画面で入力を待つ
InputのConfirmにはEnter、BackにはTが割り当てられています。IsPressedは押した瞬間だけtrueを返すため、1回の操作で状態を切り替えられます。Escapeはゲームループを終了するキーです。
Game.cppcpp
void Game::UpdateResult()
{
if (input.IsPressed(Input::Action::Confirm))
StartGame();
else
if (input.IsPressed(Input::Action::Back))
ChangeState(State::Title);
}結果を重ねて描く
結果画面では、Game::DrawからDrawPlaying、DrawResultの順に呼び出します。DrawResultで半透明の背景と結果の文字を重ねます。プレイ中の更新は行わないため、敵と弾は止まったままです。
Game.cppcpp
void Game::DrawResult() const
{
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 168);
DrawBox(0, 0, tuning::ScreenWidth, tuning::ScreenHeight, GetColor(0, 0, 0), TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
if (state == State::GameClear)
DrawString(254, 164, L"GAME CLEAR", GetColor(100, 255, 160));
else
DrawString(254, 164, L"GAME OVER", GetColor(255, 96, 112));
DrawFormatString(276, 216, GetColor(255, 255, 255), L"SCORE %02d", score);
DrawString(170, 282, L"ENTER : RETRY T : TITLE", GetColor(255, 230, 80));
}チェックリスト
- クリアとゲームオーバーで異なる結果が表示される。
- Enterで再挑戦するとHP・弾・敵・得点・残り時間が戻る。
- Tでタイトルへ戻り、Escapeで終了する。