Skip to content
第06回 プレイヤーの被弾

3 / 4 敵弾と敵の接触を処理する

このステップの目的

敵弾または敵がプレイヤーへ接触したとき、共通の被弾処理へつなぐ

敵弾が当たったとき

敵弾とプレイヤーの命中範囲が重なったら、まず敵弾を停止します。 その後TryTakeDamage()を呼び、被弾が成立したときだけ追加処理を行います。

Game.cppcpp
if (enemyShot.GetHitbox().Overlaps(player.GetHitbox()))
{
    enemyShot.Deactivate();
    if (player.TryTakeDamage())
    {
        // 被弾成立時だけ、次回以降のSEやエフェクトを追加する
    }
}

敵弾は一度の接触で消えますが、無敵中でも敵弾自体は消費されます。 これは、画面上で接触した弾を残して何度も判定しないためです。

敵と接触したとき

敵本体との接触もPlayer::TryTakeDamage()を利用します。 接触した敵は停止させ、敵弾と同じ被弾ルールへ揃えます。

第04回のプレイヤー弾と敵の判定はそのまま残し、今回の処理を追加します。

敵本体との接触も、同じTryTakeDamage()へつなぎます。 敵は接触した時点で停止させるため、無敵中でも同じ敵と繰り返し判定しません。

Game.cppcpp
if (enemy.GetHitbox().Overlaps(player.GetHitbox()))
{
    enemy.Deactivate();
    player.TryTakeDamage();
}

編集する場所

  1. Player.hGetHitbox()を追加し、Player.cppで現在位置の命中矩形を返す。
  2. Game.hResolveCollisions()を宣言する。
  3. Game.cppの更新処理で、敵弾と敵を更新した後にResolveCollisions()を呼ぶ。
  4. ResolveCollisions()へ敵弾との接触、敵本体との接触を順番に追加する。

第04回のプレイヤー弾と敵のループは削除せず、その後ろへ今回の2つのループを追加します。

チェックリスト
  • 敵弾がプレイヤーへ当たると敵弾が停止する
  • 敵本体との接触でもTryTakeDamage()を使う
  • 無敵中にHPが連続して減らない
  • 第04回の敵撃破と得点が変わっていない