Skip to content
第04回 プレイヤーの弾と敵の命中判定

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()で描画します。

1フレーム内の処理順序
オブジェクトの更新
移動後の現在位置で判定
命中判定
命中判定
撃破時のみスコア加算
得点の更新
得点の更新
最新の状態を画面へ描画
描画処理
  1. オブジェクトの更新(Update): プレイヤー、弾、敵の位置を現在の速度に基づいて前進させます。
  2. 命中判定の調停(ResolveCollisions): 移動後の確定した座標同士を比較し、衝突したオブジェクトの状態を変更(ダメージや消滅)させます。
  3. 得点や状態の反映: 撃破された敵の数に応じてスコアを更新します。
  4. 描画処理(Draw): 判定を終えた最新の状態を画面へ描画します。

この順序なら、命中判定で停止した敵は同じフレームの描画から除かれます。得点表示は次のステップで追加します。表示できたらHPを2に変えてください。1発目では得点が増えず、2発目で1点増えることを確かめます。確認後はHPを1に戻します。

チェックリスト
  • 敵に命中したことと撃破されたことの違いを説明できる
  • 敵の耐久力が0になった瞬間のみ得点が加算される構造になっている
  • ゲームループにおいて、位置更新、判定調停、描画が正しい順序で実行されていることを説明できる
  • 既存のManagerの所有関係を変更していない