第04回 プレイヤーの弾と敵の命中判定
第03回では、敵を出現させて画面内を移動させる処理を実装しました。
第04回では、プレイヤーが発射した弾と敵との命中判定を実装し、弾を当てて敵を撃破する処理を完成させます。
弾と敵の状態は、それぞれのクラスで管理します。衝突判定と撃破時の得点加算はGameクラスで行います。
始める前に
個体の有効・無効、座標、条件分岐を確認してください。矩形の命中判定は今回説明します。確認したい場合は、敵の出現と移動を参照してください。
前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。
配布プロジェクト
第04回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
第03回で実装した敵の自動出現と直進・波状移動が含まれたプロジェクトから開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
| Source/Shooting/Game.cpp | ゲームループと命中判定の調停 |
| Source/Shooting/Enemy.h | 敵の状態と処理の宣言 |
| Source/Shooting/Enemy.cpp | 敵の移動と表示 |
| Source/Shooting/PlayerShot.cpp | 弾の移動と表示 |
| Source/Shooting/Tuning/GameTuning.h | ゲームの調整値 |
この回のゴール
プレイヤーの弾と敵の接触を正しく検知し、敵を撃破して得点を加算できる状態を目指します。
- 矩形の交差判定(
Rect::Overlaps())を用いて、弾と敵の接触を検知できる - 弾が命中した際、敵の耐久力を減らし、弾自身を消滅させることができる
- 敵の耐久力が0になった瞬間を判定し、スコアを加算できる
- 複数のオブジェクト同士の相互作用を、
Gameクラスを介して安全に調停できる
今回のポイント
弾と敵は、それぞれ専用の管理クラス(PlayerShotManagerとEnemyManager)によって配列として管理されています。
弾クラスでは敵の情報を扱わず、敵クラスでも弾の情報を扱いません。
衝突を調べて結果を反映する処理は、ゲーム全体を管理するGameクラスで行います。役割を分けると、クラス同士が過度に依存するのを防ぎ、コードを修正・拡張しやすくできます。
作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | なし |
| 既存ファイルへ追記・編集 | Source/DxGame/Rect.h、Source/Shooting/Enemy.cpp、Source/Shooting/Enemy.h、Source/Shooting/EnemyManager.cpp、Source/Shooting/EnemyManager.h、Source/Shooting/Game.cpp、Source/Shooting/Game.h、Source/Shooting/PlayerShot.cpp、Source/Shooting/PlayerShot.h、Source/Shooting/PlayerShotManager.h、Source/Shooting/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Game::ResolveCollisions、Game::Draw |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。
GameTuning.hには今回必要な定数を追記し、自身で調整した既存の値を維持します。