Skip to content

第07回 ゲームの状態と終了条件 ​

第06回までに、プレイヤー操作、弾の発射、敵の出現と攻撃、命中判定、被弾処理を実装しました。アクションゲームの中心となる機能がそろいました。
第07回では、一つのゲーム作品に仕上げるため、画面遷移と終了条件を実装します。

タイトルからプレイを始め、目標スコアや時間によるクリア、HPが0になったときのゲームオーバーを判定します。結果画面からリトライできるようにし、ゲーム全体の進行を作ります。

始める前に ​

条件分岐と、複数のクラスをGameから呼び出す流れを確認してください。確認したい場合は、プレイヤーの表示と操作を参照してください。

前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。

配布プロジェクト ​

第07回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
第06回で実装したプレイヤーの被弾ダメージと無敵時間処理が含まれたプロジェクトから開始します。

配布ファイル一覧
ファイル役割
Source/Shooting/Game.hゲーム状態(State)と遷移関数の宣言
Source/Shooting/Game.cpp状態ごとの更新・描画・終了条件・リセット処理
Source/Shooting/Player.cppリトライ時のプレイヤー状態初期化
Source/Shooting/Tuning/GameTuning.hクリア目標スコアや制限時間などの調整値

この回のゴール ​

タイトル画面から開始し、勝敗に応じてクリアまたはゲームオーバー画面へ遷移し、リトライで最初から遊び直せる状態を完成させます。

  • enum class Stateを用いて、ゲームの各画面状態を型安全に定義できる
  • 既存のゲーム処理をUpdatePlaying() / DrawPlaying()へ抽出し、状態に応じて更新・描画を切り替えられる
  • 状態の遷移処理をChangeState()へ集約し、遷移時の初期化や副作用を一元管理できる
  • リトライ時にプレイヤー、弾、敵、スコア、制限時間を確実に初期化できる

今回のポイント ​

これまでのプログラムは、起動すると直ちにプレイ画面が始まり、終了条件もありませんでした。
画面を増やすたびにGame::Update()やDraw()へ整理せずにif文を追加すると、コードが複雑になり、状態ごとの管理が難しくなります。

そこで、現在の画面を状態(State)で表し、状態ごとに更新と描画を切り替えます。この有限ステートマシン(State Machine)の考え方を使います。

ゲーム画面の状態遷移図
Title
決定キー(SpaceまたはEnter)でゲーム開始
Playing
Playing
目標スコア(30点)達成、または60秒生存
GameClear
Playing
プレイヤーのHPが0
GameOver
GameClear
リトライキーで最初から再挑戦
Playing
GameClear
キャンセルキーでタイトルへ戻る
Title
GameOver
リトライキーで最初から再挑戦
Playing
GameOver
キャンセルキーでタイトルへ戻る
Title

プレイ中の処理をUpdatePlaying()とDrawPlaying()へ移し、役割に合う名前を付けます。ゲームの中身を変えずに構造を整理する、リファクタリングという作業です。

作業の準備 ​

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

作業対象
新規作成なし
既存ファイルへ追記・編集Source/Shooting/Game.cpp、Source/Shooting/Game.h、Source/Shooting/Input.cpp、Source/Shooting/Input.h、Source/Shooting/Tuning/GameTuning.h
重点的に実装・確認する処理Game::Update、Game::StartGame、Game::UpdateResult

ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。

GameTuning.hには今回必要な定数を追記し、自身で調整した既存の値を維持します。

第07回の目次 ​