インベーダー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
00

インベーダー

#1

投稿記事 by 00 » 15年前

いまDxLibでインベーダーを作っているんですが敵の複数移動で端の敵が壁にぶつかったら一斉に降りる動作をどう組めばいいか教えてください。 今だとぶつかった敵順で下におりてしまいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: インベーダー

#2

投稿記事 by softya(ソフト屋) » 15年前

一キャラづつ処理せずに、まとめて処理すれば良いだけです。
右に進んでいたら、右端に来たら全部を一度に下げます。左端も同様です。
ソースがないので、ちよっと簡単な説明すぎかも知れませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

00

Re: インベーダー

#3

投稿記事 by 00 » 15年前

プログラムはこんな感じなんですが、これでは駄目ですかね

コード:

// 敵
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 );
	}
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: インベーダー

#4

投稿記事 by softya(ソフト屋) » 15年前

コード:

これだと一体づつ判定しているので、
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 );
    }
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る