ページ 11

STGで敵や弾・自機などの描画順を自由に行いたい。

Posted: 2012年8月02日(木) 21:58
by YYSS
こんばんわは。

表題の件、現在製作しているSTGでは、

背景 -> 敵 -> 自機 -> エフェクト -> 敵弾 -> スコアフレーム
         奥    - - - - - >   前面

の順に描画しているのですが、今考えている演出で、
敵が前面から登場し自機の上(重なったときに自機が隠れる)を通らせたいと考えているのですが、
なかなか良い方法が思いつきません。


敵はクラスの配列で管理しています。
現在はこんな感じの描画方法です。(イメージ)

コード:

	C_Enemy  Zako[ 100 ];	//敵クラス
	C_Player  Player;		//自機クラス

	//描画
	Zako.DrawProcess();		//全ての敵を先に描画
	Plauer.DrawProcess();	//敵の上に自機が描画される
これだと、どうがんばっても敵を自機の上に描画できないので
レイヤー分けをして描画しようと考えました。

メンバー変数にレイヤーを記憶する変数を追加し

コード:

	//描画
	for( int i=0 ; i<10 ; i++ ){
		Zako.DrawProcess( i );	//引数で指定されたレイヤーのみを表示
		Plauer.DrawProcess( i );
	}

コード:

void C_Enemy::DrawProcess( int layer ){

	for( int i=0 ; i<ENEMY_MAX ; i++ ){
		//敵オブジェクトのレイヤーと引数がおなじなら描画
		if( layer == m_Layer ){
			Draw();	//敵を描画
		}
	}	
}
とやれば解決なのですが、すごく無駄が多いような気がします。
空のループを何回も回す場合も出てくるので、必要最低限のループで描画できるとベストなのですが・・・

STLのmapでソートするのも考えましたが、
毎フレーム、ソートするととても処理が間に合わなかったので;;


何かアドバイスを下さると幸いです。


開発環境は、
 Windows 7 Ultimate SP1 64bit
 Visual C++ 2010
 DXライブラリ

Re: STGで敵や弾・自機などの描画順を自由に行いたい。

Posted: 2012年8月02日(木) 22:21
by h2so5
一時的な演出なら、その時だけなにかフラグをたてて分岐すればいいんじゃないでしょうか。

コード:

    if (reverse_flag) {
        Plauer.DrawProcess();
        Zako.DrawProcess();
    } else {
        Zako.DrawProcess();
        Plauer.DrawProcess();
    }

Re: STGで敵や弾・自機などの描画順を自由に行いたい。

Posted: 2012年8月03日(金) 23:18
by YYSS
h2so5 さんが書きました:一時的な演出なら、その時だけなにかフラグをたてて分岐すればいいんじゃないでしょうか。

コード:

    if (reverse_flag) {
        Plauer.DrawProcess();
        Zako.DrawProcess();
    } else {
        Zako.DrawProcess();
        Plauer.DrawProcess();
    }
変に大掛かりにせず、一時的に分岐するようにしたらうまくいきました。

深く考えすぎていたようです;;

ありがとうございましたー