Skip to content
第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未満にならない
  • 点滅表示と被弾拒否の責任を混同していない