複数敵の左右移動の判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
maloc
記事: 4
登録日時: 14年前

複数敵の左右移動の判定について

#1

投稿記事 by maloc » 14年前

今、シューティングゲームで敵の左右移動を実装させています。
目的はインベーダーのような縦×横の数キャラがまとまって動くようにしようとしています。
まず敵を横1列(図左)だけ作り判定を実装したところ上手く動いたのですが、2列(図右)にしたところ判定を通らず画面外へ出てしまいました。
試しに最下敵の両端の敵だけ判定をとれるように配列に直接数値を代入してみても失敗でした。

この場合、列ごとに配列を作っていったほうがよいのでしょうか?しかし、同じ機能をもつ敵なのに何度も作っていては無駄になってしまいますよね。

コード:

#define CHARACTER_MAX 10//表示するキャラクタの数(.h)

//-----------------------
//	敵移動(en_10pt[キャラ数][ポリゴンの各頂点])
//-----------------------
void EnMove(void){
	int i,ch;
	//敵移動速度
	static int en_move = 2;
      //左右反転
	for(ch = 0;ch < CHARACTER_MAX ; ch++){
		if(en_10pt[ch][0].x < 24 || en_10pt[ch][1].x > 306){
			en_move = -en_move;
		}
	}
      //移動
	for(i = 0;i < 4; i++){
		for(ch = 0;ch < CHARACTER_MAX; ch++){
                 //もしflgが0(そのキャラが消滅してないの)なら移動
			if(en_10pt[ch][i].flg == 0){
				en_10pt[ch][i].x += en_move;
			}
		}
	}
}

コード:


//-----------------------------
//ポリゴンのセット
//-----------------------------
	int i,ch;

	//敵キャラ縦横
	static float width_x1 = 24 , width_x2 = 48 , height;

	//敵キャラ
	for(ch = 0;ch < CHARACTER_MAX;ch++)
	{
            //0キャラ目以降は30間隔で配置
	      if(ch != 0)
		{
		      width_x1 = width_x1 + 30;
			width_x2 = width_x2 + 30;
		}
            //2列目
		if(ch == 5)
		{
			height = 14;
			width_x1 = 24;
			width_x2 = 48;
		}
		en_10pt[ch][0].x = en_10pt[ch][2].x = width_x1;
		en_10pt[ch][0].y = en_10pt[ch][1].y = 226 - height;
		en_10pt[ch][1].x = en_10pt[ch][3].x = width_x2;
		en_10pt[ch][2].y = en_10pt[ch][3].y = 240 - height;
		for(i = 0 ; i < 4 ; i++)
		{
			en_10pt[ch][i].z = 0;
			en_10pt[ch][i].rhw = 1.0f;
			en_10pt[ch][i].diffuse = D3DCOLOR_RGBA(255,255,255,255);
		}
		en_10pt[ch][0].u = 0;		en_10pt[ch][0].v = 0;
		en_10pt[ch][1].u = 0.5f;	en_10pt[ch][1].v = 0;
		en_10pt[ch][2].u = 0;		en_10pt[ch][2].v = 1;
		en_10pt[ch][3].u = 0.5f;	en_10pt[ch][3].v = 1;
	}
添付ファイル
キャプチャ.JPG
キャプチャ.JPG (13.24 KiB) 閲覧数: 1482 回

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: 複数敵の左右移動の判定について

#2

投稿記事 by ookami » 14年前

たぶん、
for(ch = 0;ch < CHARACTER_MAX ; ch++){
  if(en_10pt[ch][0].x < 24 || en_10pt[ch][1].x > 306){
    en_move = -en_move;
  }
}
ここで、
    en_move = -en_move;
が2回実行されてしまうからだと思います。
そこで、
    en_move = -en_move;
    break;
でどうでしょうか?

アバター
maloc
記事: 4
登録日時: 14年前

Re: 複数敵の左右移動の判定について

#3

投稿記事 by maloc » 14年前

確かに2列敵がいるとforで回しているので -en_moveを2回実行することになり、結局もとの数値に戻ってしまいますね。ありがとうございました

閉鎖

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