Appearance
第02回 プレイヤーの弾とオブジェクトプール
1 / 4 プレイヤーの弾クラス
このステップの目的
弾1発分の機能をPlayerShotクラスに実装する
プレイヤーの弾を実装する
シューティングゲームの弾に固有のビジュアル、表示位置、命中判定、そして寿命があり、意外と複雑です。
今回、それらの機能をPlayerShotクラスにまとめて実装します。
PlayerShotのpositionは弾の中心座標、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()は弾の位置を指定の発射位置に設定し、自身をアクティブ状態にします。
表示処理はisActiveがfalseなら何もせず、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()で発射位置へ移動し、実行状態になる - 停止中の弾は描画されない