Appearance
第04回 プレイヤーの弾と敵の命中判定
前回は、敵が出現し、プレイヤーの弾が画面を飛ぶようになりました。 今回は、弾と敵が重なったときに命中として扱い、敵を倒せるようにします。
弾と敵の状態はそれぞれのクラスで管理し、衝突したかどうかの判断と得点の更新はGameが調停します。
配布プロジェクト
前回の作業が完了した状態と同等のプロジェクトを配布します。 第04回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
この回のゴール
授業終了時には、プレイヤーの弾が敵へ当たると敵と弾が停止し、敵を倒した数だけ得点が増えます。
- 表示用の矩形と命中判定用の矩形を区別する
Rect::Overlaps()で2つの矩形の重なりを判定する- 命中した弾と敵をそれぞれのクラスへ依頼して停止する
Gameが相互作用の順序と得点を管理する
今回のポイント
弾と敵は、それぞれのクラスとManagerが状態を管理しています。 今回はその仕組みを変更せず、Gameへ相互作用の処理を追加します。
敵を直接削除したり、弾の配列をGameへ移したりしません。
PlayerShotManager
命中判定の対象を渡す
Game
EnemyManager
命中判定の対象を渡す
Game
Game
命中した弾を停止
PlayerShot
Game
命中した敵へダメージ
Enemy
1 / 4表示範囲と命中範囲を確認する画面上の見た目とゲーム上の接触範囲を分けて考える2 / 4命中した弾と敵を停止する命中した組み合わせを見つけ、弾と敵それぞれの責任へ処理を依頼する3 / 4撃破と得点を追加する敵が撃破された瞬間だけ得点を増やし、命中処理の結果をゲームへ反映する4 / 4命中判定を動作確認する弾、敵、得点の変化を順番に観察し、次回の敵弾追加へつなげる
今回実装する範囲
| 区分 | 内容 |
|---|---|
| 新しく実装する処理 | Rect::Overlaps()を使った弾と敵の命中、撃破、得点 |
| 既存の処理を利用する | PlayerShotManager、EnemyManager、各オブジェクトのGetHitbox() |
| 後の回で追加する処理 | 敵弾との命中、プレイヤーHP、エフェクト、音声 |
今回の完成例
まず自分の実装を動かしてから、第05回の配布プロジェクトを完成例として比較します。
| 確認するファイル | 確認する内容 |
|---|---|
Enemy.cpp | HPの初期化とダメージによる停止 |
Game.cpp | 弾と敵の矩形比較、命中後の停止、撃破時の得点 |
GameTuning.h | 命中範囲、攻撃力、敵HPの調整値 |