Skip to content
第02回 プレイヤーの弾とオブジェクトプール

1 / 4 プレイヤーの弾クラス

このステップの目的

弾1発分の機能をPlayerShotクラスに実装する

プレイヤーの弾を実装する

シューティングゲームの弾に固有のビジュアル、表示位置、命中判定、そして寿命があり、意外と複雑です。
今回、それらの機能をPlayerShotクラスにまとめて実装します。

PlayerShotpositionは弾の中心座標、isActiveは更新や描画の対象かどうかを表します。

PlayerShot.hcpp
class PlayerShot
{
public:
    // 弾の発射
    void Spawn(const Vector2& startPosition);

    // 弾の更新
    void Update(float deltaTime);

    // 弾の描画
    void Draw(const ImageManager& images) const;

    // 弾が現在アクティブならtrueを返す
    bool IsActive() const;

    // 弾を停止する
    void Deactivate();

private:
    Vector2 position = {};
    bool isActive = false;
};

弾の生成と描画

弾は全てが常時表示されるわけではありません。
ここでは個々の弾にアクティブ状態を示すフラグisActiveを持たせ、発射されている弾だけを描画するようにします。

Spawn()は弾の位置を指定の発射位置に設定し、自身をアクティブ状態にします。
表示処理はisActivefalseなら何もせず、trueなら弾の画像を描画します。

PlayerShot.cppcpp
void PlayerShot::Spawn(const Vector2& startPosition)
{
    position = startPosition;
    isActive = true;
}

void PlayerShot::Draw(const ImageManager& images) const
{
    if (!isActive)
        return;

    images.Draw(ImageManager::Id::PlayerShot, GetDrawRect());
}

ここまで実装したのは、あくまで弾一発分の処理です。 実際の画面への表示は、次のステップでPlayerShotManagerを経由して行います。

チェックリスト
  • PlayerShotが位置と実行状態を持っている
  • Spawn()で発射位置へ移動し、実行状態になる
  • 停止中の弾は描画されない