はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX 弾幕増やす基盤がそれっぽくなりました

あいさつ

前回はちょっとふざけすぎた気がしているはかせです。
ただ反省はしているが後悔はしてないってやつなんで
これからもたまにあんなテンションで書きたいと思います。
(今回は違いますw)

今回のテーマ

さて前回ちょっとはっちゃけちゃったので今回はまじめに行きます。
ちょっと前にこんな記事を上げました。
DirectX 弾幕の初めの一歩を踏み出しました - はかせのラボ

ここで書いてあるように弾幕の実装そのものはベクトル計算なので
そこまで難しくないです。(凝った動きさせようとするとまた変わりますが)

なので今回は
①種類を増やす
②増やしたやつに差し替える

この二つをやっていきたいと思います。

弾幕の種類

これは簡単です。

//弾幕ベースクラス
public:
	BarrageBase() {};
	~BarrageBase() {};
	BarrageName GetName() const { return mName; }
	int GetBulletNum() const { return mBulletNum; }
	//発射待機中か
	bool IsCoolTime(int time) { return time % mCoolTime == 0; }
	//弾幕が打ち終わったか
	virtual bool IsBarrageEnd() = 0;
	//弾幕生成
	virtual void CreateBarrage(BulletManager* manager,DXGameObject* player,DXGameObject* enemy) = 0;
protected:
	//弾幕の名前を示すenum
	BarrageName mName;
	//弾を発射するフレーム間隔
	int mCoolTime;
	//弾を発射する際に同時に打つ弾数
	int mBulletNum;
	//弾速
	float mBulletSpeed;
	//弾の角度を変える時に使う変数
	float mAngle;
	//度数法表記の角度を弧度法表記の角度に変換する
	float ToRadian(float angle) { return angle * (float)(acos(-1.0f) / 180.0f); }
	//渡されたベクトルを正規化する
	void Normalization(float &x, float &y);
	//呼ばれた回数
	int mCount;

こんな感じで前やった弾の生成を
まるっと別クラスにして抽象クラスにします。
あとはこのクラスの弾幕生成などを必要に応じて
具象クラスで書き換えればおkです。

弾幕を差し替える

これもそんな難しくはないです。
私は何回も軽量化ということでオブジェクトプーリングを
実装してきました。

考え方はあまり変わらず
弾幕クラスのインスタンスを作る
②生成したインスタンスのポインタを管理するクラスを作る
③管理クラスとやり取りしてポインタを変える
以上です。

論より証拠。
動画です。
youtu.be

適当な回数打ったらswitch文でぐるぐる弾幕を変えてます。
あとしれっと音も付けました。
音に関しては〇✖さんのをほぼ丸パクリしたのでそちらをどぞー

今回作ったものはgithubに上げました
github.com