第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)の考え方を使います。
プレイ中の処理を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には今回必要な定数を追記し、自身で調整した既存の値を維持します。