弾幕STGにおける弾の描画順序について
Posted: 2016年4月03日(日) 00:02
いつもお世話になっております。
現在C++ DxLib ver 3.16bを用いて弾幕STGを作成しており、
その中で敵弾の登録、及び描画の際の描画順序に関して悩んでおります。
開発環境
VS Community 2015
具体的に言うと、大量に弾幕が描画され、弾同士が重なる場合、通常あとに発射された弾が後ろにあるように見えるのが普通であり、
ほとんどのSTGにおいてそうなっているかと思いますが、現在の弾の登録の実装方法だと先頭からフラグが立っていない要素を探し
初期化する方法をとっているため、弾が画面外に出て削除された場合に弾の描画順序が前後することがあります。
これらの管理方法として調べた所、Zバッファを用いた実装がなされている場合もあるようですが、アルファブレンド時に相性が悪いとの情報を目にしたりと、何か他の実装方法はないかと思っております。 フレームごとに配列を先頭方向に詰める、弾ごとにカウンタを持たせて
カウンタの値が小さい順に描画する...などいろいろと考えてみたのですがいずれにしても捜索回数が増えて負荷が大きくなってしまいそう(?)ですし、私が思いつく程度の実装方法よりもっと効率的な実装方法が無いものかと悩んでおります。
今までSTGを設計された方はどのように実装したのでしょうか、実例などを教えていただきたく、質問させていただきました。
以下に弾の登録、及び描画部分のソースコードを提示します。
Enemy.cpp Enter_shot関数
Enemy.cpp Draw関数
追記:弾は画面外に出たフレームで削除されます。
現在C++ DxLib ver 3.16bを用いて弾幕STGを作成しており、
その中で敵弾の登録、及び描画の際の描画順序に関して悩んでおります。
開発環境
VS Community 2015
具体的に言うと、大量に弾幕が描画され、弾同士が重なる場合、通常あとに発射された弾が後ろにあるように見えるのが普通であり、
ほとんどのSTGにおいてそうなっているかと思いますが、現在の弾の登録の実装方法だと先頭からフラグが立っていない要素を探し
初期化する方法をとっているため、弾が画面外に出て削除された場合に弾の描画順序が前後することがあります。
これらの管理方法として調べた所、Zバッファを用いた実装がなされている場合もあるようですが、アルファブレンド時に相性が悪いとの情報を目にしたりと、何か他の実装方法はないかと思っております。 フレームごとに配列を先頭方向に詰める、弾ごとにカウンタを持たせて
カウンタの値が小さい順に描画する...などいろいろと考えてみたのですがいずれにしても捜索回数が増えて負荷が大きくなってしまいそう(?)ですし、私が思いつく程度の実装方法よりもっと効率的な実装方法が無いものかと悩んでおります。
今までSTGを設計された方はどのように実装したのでしょうか、実例などを教えていただきたく、質問させていただきました。
以下に弾の登録、及び描画部分のソースコードを提示します。
Enemy.cpp Enter_shot関数
//パターン2 自機狙い弾
case 2:
{
//2フレームに一回、200フレーム間に
if (s_cnt % 2 == 0 && s_cnt <= 200)
{
for (int i = 0;i < ENEMY_SHOT_MAX;++i)
{
if (shot[i].flag == false)
{
shot[i].flag = true;
shot[i].refflag = false;
shot[i].x = this->x;
shot[i].y = this->y;
shot[i].ang = this->ang;
break;
}
}
}
}