Appearance
第07回 ゲームの状態と終了条件
1 / 4 ゲームの状態を表す
このステップの目的
ゲーム画面の種類を列挙型で表し、現在の状態に応じて処理を選べるようにする
Stateをenum classで定義する
画面の種類を整数や文字列で管理せず、enum class Stateへまとめます。 列挙子を限定できるため、状態として扱える値が明確になります。
Game.hcpp
enum class State
{
Title,
Playing,
GameClear,
GameOver
};
State state = State::Title;状態ごとの更新を分ける
これまでのプレイ処理はUpdatePlaying()へ移します。 Playerや各Managerの処理内容は変更せず、Update()から現在の状態に応じて呼び出します。
編集は次の順番で進めます。
Game.hへStateの列挙と状態ごとの関数を宣言する。Game.cppの既存の更新処理をUpdatePlaying()へ移す。Game.cppの既存の描画処理をDrawPlaying()へ移す。Update()とDraw()のswitchから状態ごとの関数を呼ぶ。
Player、弾、敵のクラス内部は変更しません。最初に処理を移し、動作が同じことを確認してからタイトルと結果画面を追加します。
Game.cppcpp
switch (state)
{
case State::Playing:
UpdatePlaying(deltaTime);
break;
}タイトルや結果画面では、プレイ中の敵や弾を更新しません。
状態ごとの担当を、次の表で確認します。
| State | 更新する処理 | 描画する画面 | 主な入力 |
|---|---|---|---|
Title | タイトル入力 | タイトル | 決定で開始 |
Playing | Player、弾、敵、命中、時間 | プレイ画面とHUD | 移動、射撃 |
GameClear | 結果画面の入力 | 最後のプレイ画面とクリア表示 | リトライ、タイトル |
GameOver | 結果画面の入力 | 最後のプレイ画面とゲームオーバー表示 | リトライ、タイトル |
この表とUpdate()、Draw()のswitchを照らし合わせ、各状態で処理が混ざっていないことを確認します。
チェックリスト
- 状態を
enum classで表している - プレイ中の既存処理を
UpdatePlaying()へまとめている - 状態によって更新する処理を選んでいる