ページ 11

インベーダー

Posted: 2011年1月18日(火) 10:54
by 00
いまDxLibでインベーダーを作っているんですが敵の複数移動で端の敵が壁にぶつかったら一斉に降りる動作をどう組めばいいか教えてください。 今だとぶつかった敵順で下におりてしまいます。

Re: インベーダー

Posted: 2011年1月18日(火) 12:10
by softya(ソフト屋)
一キャラづつ処理せずに、まとめて処理すれば良いだけです。
右に進んでいたら、右端に来たら全部を一度に下げます。左端も同様です。
ソースがないので、ちよっと簡単な説明すぎかも知れませんが。

Re: インベーダー

Posted: 2011年1月18日(火) 12:19
by 00
プログラムはこんな感じなんですが、これでは駄目ですかね

コード:

// 敵
EMAX_X = 10;
typedef struct {
	int xPos;
	int yPos;
	int Speed;
	bool En;
	bool xDir;
	bool yDir;
	int no;
} ENEMYSTATE;
ENEMYSTATE e_state[EMAX_X];

for( int x = 0; x < EMAX_X; x++ ){
             e_state[x].En = false;
	e_state[x].Speed = 10;
	e_state[x].xDir = false;
	e_state[x].yDir = false;
	e_state[x].xPos = 40 + x * 32;
	e_state[x].yPos = 40;
}

for( int x = 0; x < EMAX_X; x++ ){
	if( e_state[x].En == false ){			// テーブルが空か??
		e_state[x].En = true;				// 生まれた
	}
	if( e_state[x].En == true ){
		if( e_state[x].xDir == false ){
			if( CTm.GetFrame_local() % 20 == 0 ){
				e_state[x].xPos += e_state[x].Speed;
				if( e_state[x].xPos >= 440 ){
					e_state[x].xDir = true;
					e_state[x].yDir = true;
				}
			}
		} else if( e_state[x].xDir == true ){
			if( CTm.GetFrame_local() % 20 == 0 ){
				e_state[x].xPos -= e_state[x].Speed;
				if( e_state[x].xPos <= 40 ){
					e_state[x].yDir = true;
					e_state[x].xDir = false;
				}
			}
		}
		if( e_state[x].yDir == true ){
			e_state[x].yPos += 32;
			e_state[x].yDir = false;
		}
		DrawGraph( e_state[x].xPos, e_state[x].yPos, g_state.my_en[0], TRUE );
	}
}


Re: インベーダー

Posted: 2011年1月18日(火) 12:27
by softya(ソフト屋)

コード:

これだと一体づつ判定しているので、
e_state[x].yDir = true;
のフラグはキャラ毎ではなく一個で良いです。
つまり、yDir = true;で良いです。
ループの外にint yDir = false;をお忘れなく。

で下に下げる処理は別ループに分けてください。
for( int x = 0; x < EMAX_X; x++ ){
    if( e_state[x].En == true ){
        if( yDir == true ){
            e_state[x].yPos += 32;
            e_state[x].yDir = false;
        }
    }
}
描画も分けることをおすすめします。
for( int x = 0; x < EMAX_X; x++ ){
    if( e_state[x].En == true ){
        DrawGraph( e_state[x].xPos, e_state[x].yPos, g_state.my_en[0], TRUE );
    }
}