Skip to content
第05回 プレイヤーを狙う敵弾

1 / 4 敵弾1発分を作る

このステップの目的

敵弾の位置と速度を個体クラスへ分け、発射後の移動を独立させる

PlayerShotとの違い

PlayerShotは常に上方向へ進みました。 EnemyShotは発射した敵とプレイヤーの位置から速度を決め、決めた速度を保持します。

EnemyShot.hの構造cpp
class EnemyShot
{
public:
    void Spawn(const Vector2& startPosition, const Vector2& targetPosition);
    void Update(float deltaTime);
    void Draw(const ImageManager& images) const;

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

これは責任を確認するための構造例です。実装時は、IsActive()Deactivate()GetDrawRect()GetHitbox()PlayerShotと同じように用意します。 作業する順番は、宣言、Spawn()Update()Draw()、状態確認と矩形取得の順です。

まずは、発射位置を保存し、保存した速度で移動する処理を用意します。 方向と速度の計算は次のステップでSpawn()へ追加します。 この段階ではvelocityが0なので、敵弾がまだ動かないことが正しい状態です。 targetPositionを使った方向計算は、次のステップで追加して完成させます。

EnemyShot.cppcpp
void EnemyShot::Spawn(const Vector2& startPosition, const Vector2& targetPosition)
{
    position = startPosition;
    velocity = {};
    isActive = true;
}

void EnemyShot::Update(float deltaTime)
{
    if (!isActive)
        return;

    position.x += velocity.x * deltaTime;
    position.y += velocity.y * deltaTime;
}

目標位置そのものを保存して毎フレーム計算するのではなく、発射時に速度へ変換します。 これにより、敵弾は追尾せず、発射時点の狙いへ向かう弾になります。

Managerも最初から分ける

敵弾はプレイヤー弾とは、画像、速度、命中対象が異なります。 同じ配列へ種類を表すフラグを追加せず、EnemyShotManagerを用意します。

チェックリスト
  • EnemyShotが位置と速度を持っている
  • 発射後に目標位置を追い続けない
  • 敵弾をプレイヤー弾と別のManagerで所有する