Appearance
第06回 プレイヤーの被弾
2 / 4 無敵時間を更新する
このステップの目的
被弾後の一定時間をタイマーで管理し、連続接触による連続ダメージを防ぐ
タイマーを毎フレーム減らす
無敵時間は秒単位の設定値です。 毎フレームdeltaTimeを引き、0未満にならないようにします。
Player.cppcpp
invincibleTimer = std::max(0.0f, invincibleTimer - deltaTime);タイマーの更新はプレイヤーの更新処理へ置きます。 Gameが無敵時間の内部値を直接変更しないため、被弾のルールがPlayerへ集まります。
表示へ反映する
無敵時間中は一定間隔で描画を省略し、点滅しているように見せます。 点滅表示は見た目の処理であり、命中判定そのものを無効にする条件ではありません。 命中を受け付けない判断はTryTakeDamage()が行います。
描画時は、無敵時間が残っている間だけ一定間隔で描画を省略します。 描画を省略する条件をDraw()の中へ置き、更新処理のタイマー計算とは役割を分けます。
Player.cppcpp
void Player::Draw(const ImageManager& images) const
{
constexpr float BlinkRate = 20.0f;
const bool blinkOff =
invincibleTimer > 0.0f &&
static_cast<int>(invincibleTimer * BlinkRate) % 2 == 0;
if (blinkOff)
return;
images.Draw(ImageManager::Id::Player, GetDrawRect());
}チェックリスト
- 無敵時間を
deltaTimeで減らしている - 0未満にならない
- 点滅表示と被弾拒否の責任を混同していない