Appearance
第23回 トラップとゲーム進行
第22回では、敵キャラクターの物理運動と巡回移動を実装しました。
第23回では、接触するとミスになるトゲトラップ(Spike)、敵との攻防判定(踏みつけ撃破と被弾)、落下判定、およびゲーム全体の進行状態を管理するステートマシン(GameState)を実装します。
配布プロジェクト
第23回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第22回の敵巡回処理と地形衝突処理が含まれたプロジェクトから開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Stage.cpp | トゲタイルの危険判定(isHazard)の管理 |
Source/Platformer/Game.h / Game.cpp | GameState の状態遷移、敵との当たり判定、リトライ処理 |
Source/Platformer/Tuning/GameTuning.h | トゲの危険判定矩形(余白調整)、踏みつけ時の跳ね返り初速 |
この回のゴール
トゲトラップ、敵の側面接触、ステージ最下部への落下によりゲームオーバーとなり、ゴールへの接触でクリアとなるゲームループを構築します。また、結果画面からリトライやタイトル画面への復帰ができるようにします。
- 進入可能でありながら接触するとミスになるトゲトラップ(
isHazard)を実装できる - プレイヤーと敵の衝突において、「上からの踏みつけ撃破」と「側面・下からの被弾」を幾何学的に判別できる
- ステージ最下部から落下した際のミス判定を実装できる
GameStateによるステートマシンを導入し、状態遷移に伴うステージ初期化や音声の切り替えを1箇所に集約できる
今回のポイント
1. 進入不可(isSolid)と危険領域(isHazard)の分離
トゲトラップは移動を遮る壁ではなく、接触した瞬間にミスとなる危険領域です。タイル定義に isSolid(壁・床)と isHazard(危険領域)の独立した属性を持たせることで、同じステージCSVデータから地形判定とトラップ判定を両立させます。
2. 踏みつけ撃破と被弾判定の幾何学的判別
プレイヤーと敵の当たり判定が重なった際、以下の条件で撃破か被弾かを判別します。
- プレイヤーが落下中であること(
velocity_.y > 0.0f) - プレイヤーの足底(下端)が敵の中心高さ以下にあること
上記を満たす場合は「踏みつけ成功」として敵を撃破し、プレイヤーを上方へ小さく跳ね返らせます。満たさない接触(横や下からの接触)は被弾とし、ゲームオーバーへ遷移します。
3. ステートマシンによる進行管理
ゲームの状態遷移を GameState 列挙型で一元管理します。
図を準備しています…
状態の書き換え、ステージ初期化(ResetStage)、BGMやジングル(効果音)の切り替えを ChangeState() メソッドに集約することで、遷移に伴う処理を整理します。
作業の準備
開始用ZIPは前回までの到達状態です。今回の新規ファイルはありません。ファイルの登録方法と自分の変更の引き継ぎは、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | なし |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Game.h、Source/Platformer/ImageManager.cpp、Source/Platformer/ImageManager.h、Source/Platformer/Input.cpp、Source/Platformer/Input.h、Source/Platformer/Player.cpp、Source/Platformer/Player.h、Source/Platformer/SoundManager.cpp、Source/Platformer/SoundManager.h、Source/Platformer/Stage.cpp、Source/Platformer/Stage.h、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Game::UpdatePlaying()、Game::ChangeState()、Game::ResetStage() |
ヘッダーの宣言、include、画像などの登録表、読み込みのエラー処理は、最終ステップの参考実装を必要に応じて利用します。重点関数は各ステップで処理の理由を確かめながら記述します。関数を変更するときは、宣言・定義・呼び出し元の整合性を保ちます。
必要に応じて GameTuning.h に定数を追加し、トラップの余白や跳ね返り初速を調整します。
第23回の目次
1 / 4トゲトラップの危険判定と進入属性の分離タイル定義に「進入不可フラグ(
isSolid)」と「危険領域フラグ(isHazard)」を独立して導入し、トゲトラップの進入可能性とミス判定を両立させる仕組みを実装します。2 / 4ゲーム状態と遷移を集約するタイトル・プレイ中・クリア・ゲームオーバーの4状態を GameState 列挙型で表現し、状態に応じた更新処理の切り替えと、遷移に伴う初期化や音響制御を ChangeState() に集約する方法を学びます。3 / 4敵接触を踏みつけとダメージへ分けるプレイヤーと敵の当たり判定が重なった際、プレイヤーの運動方向と幾何学的な位置関係から「踏みつけ撃破」と「被弾(ゲームオーバー)」を適切に判別する処理を実装します。4 / 4終了条件とリトライを接続するトゲトラップ・敵接触・落下・ゴールの4つの終了条件を優先順位に従って判定し、ステージリセット機能と音響制御を連動させてリトライ処理を実装します。動作確認
- トゲの見た目よりわずかに内側に調整された危険判定により、自然な接触判定が行われること
- 敵を空中から踏みつけると敵が倒れてプレイヤーが跳ね上がり、横から触れるとゲームオーバーになること
- 穴へ落下した際にゲームオーバーへ遷移すること
- ゲームオーバーやクリア画面から、ジャンプキーでステージ初期状態へリトライできること
- 各状態で対応するBGMやSEが適切に再生・停止されること
次回は、新しい地形画像を追加する手順を実践し、デバッグ機能の整理、Releaseビルド、配布用パッケージの作成を行います。