Skip to content
第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で終了する。