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

1 / 4 PlayerにHPと被弾処理を追加する

このステップの目的

プレイヤー自身がHPと無敵時間を管理し、被弾の成立結果を呼び出し側へ返す

HPをPlayerの状態にする

HPはゲーム全体の変数ではなく、プレイヤー自身の状態です。 Reset()で最大HPへ戻し、IsAlive()で生存状態を返します。

Player.hcpp
bool TryTakeDamage();
bool IsAlive() const;
int GetHp() const;

private:
    int hp = 0;
    float invincibleTimer = 0.0f;

被弾が成立したときだけ変更する

無敵時間中に接触しても、HPと無敵時間を変更しません。 実際にHPを減らせたときだけtrueを返すため、後のSEやエフェクトも同じ成立条件へ接続できます。

今回の実装では、開始時のHPは3、1回の被弾で1減ります。 HPが2、1、0へ変化することを確認し、0になった時点ではまだゲームオーバー画面へ移らないことも確認します。

まず、Reset()で今回追加する状態を初期化します。既にあるプレイヤー位置の初期化は残し、その後へHPと無敵時間の初期化を追加します。

Player.cppcpp
void Player::Reset()
{
    // 既存の位置初期化は残す
    position = tuning::player::StartPosition;

    hp = tuning::player::MaxHp;
    invincibleTimer = 0.0f;
}
Player.cppcpp
bool Player::TryTakeDamage()
{
    if (invincibleTimer > 0.0f)
        return false;

    --hp;
    invincibleTimer = tuning::player::InvincibleTime;
    return true;
}
チェックリスト
  • HPがPlayerのメンバになっている
  • Reset()でHPが最大値へ戻る
  • 無敵中はTryTakeDamage()falseを返す
  • 被弾成立時だけHPが1減る