Appearance
第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で所有する