インベーダー
Posted: 2011年1月18日(火) 10:54
いまDxLibでインベーダーを作っているんですが敵の複数移動で端の敵が壁にぶつかったら一斉に降りる動作をどう組めばいいか教えてください。 今だとぶつかった敵順で下におりてしまいます。
// 敵
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 );
}
}
これだと一体づつ判定しているので、
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 );
}
}