第04回 プレイヤーの弾と敵の命中判定1フレーム内の処理順序
3 / 4 撃破と得点の加算
このステップの目的
敵が撃破された瞬間を正しく判定して得点を加算し、ゲームループ内の処理順序を理解します。
「命中」と「撃破」の概念を区別する
弾が敵に当たる「命中」と、敵を倒す「撃破」は別の出来事です。
現在は敵のHPが1なので、1発の命中で撃破できます。ここでは、HPを2に変えても、撃破したときだけ1点増える処理を作ります。
まずGame.hのEnemyManager enemies;の下に得点を保存する変数を追加します。
Game.hcpp
EnemyManager enemies;
int score = 0;Game.cppのGame::Run()でも、敵の初期化の直後に得点を0へ戻します。
Game.cpp(Run内)cpp
enemies.Reset();
score = 0;続いてResolveCollisions()の内側のループで、playerShot.Deactivate()とbreakの間へ加算処理を追加します。敵が停止した場合だけscoreを1増やします。
Game.cppcpp
// ダメージを適用し、弾を消滅させる
enemy.TakeDamage(tuning::playerShot::Damage);
playerShot.Deactivate();
// 敵のHPが0以下になって停止した場合のみ、得点を加算する
if (!enemy.IsActive())
++score;
break;この順序なら、敵の耐久力にかかわらず、とどめの一撃で撃破したときだけ得点を加算できます。
ゲームループ内における処理の順序
1フレーム内の処理順序は、ゲームの動きや画面表示の整合性に関わります。Game::Run()のループでは、Update()の中で移動と命中判定を済ませてから、Draw()で描画します。
オブジェクトの更新
移動後の現在位置で判定
命中判定
命中判定
撃破時のみスコア加算
得点の更新
得点の更新
最新の状態を画面へ描画
描画処理
- オブジェクトの更新(
Update): プレイヤー、弾、敵の位置を現在の速度に基づいて前進させます。 - 命中判定の調停(
ResolveCollisions): 移動後の確定した座標同士を比較し、衝突したオブジェクトの状態を変更(ダメージや消滅)させます。 - 得点や状態の反映: 撃破された敵の数に応じてスコアを更新します。
- 描画処理(
Draw): 判定を終えた最新の状態を画面へ描画します。
この順序なら、命中判定で停止した敵は同じフレームの描画から除かれます。得点表示は次のステップで追加します。表示できたらHPを2に変えてください。1発目では得点が増えず、2発目で1点増えることを確かめます。確認後はHPを1に戻します。
チェックリスト
- 敵に命中したことと撃破されたことの違いを説明できる
- 敵の耐久力が0になった瞬間のみ得点が加算される構造になっている
- ゲームループにおいて、位置更新、判定調停、描画が正しい順序で実行されていることを説明できる
- 既存のManagerの所有関係を変更していない