Appearance
第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();
}編集する場所
Player.hへGetHitbox()を追加し、Player.cppで現在位置の命中矩形を返す。Game.hへResolveCollisions()を宣言する。Game.cppの更新処理で、敵弾と敵を更新した後にResolveCollisions()を呼ぶ。ResolveCollisions()へ敵弾との接触、敵本体との接触を順番に追加する。
第04回のプレイヤー弾と敵のループは削除せず、その後ろへ今回の2つのループを追加します。
チェックリスト
- 敵弾がプレイヤーへ当たると敵弾が停止する
- 敵本体との接触でも
TryTakeDamage()を使う - 無敵中にHPが連続して減らない
- 第04回の敵撃破と得点が変わっていない