本館:敵の弾を誘導させるには

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

本館:敵の弾を誘導させるには

#1

投稿記事 by LisetteLander » 14年前

敵の弾をホーミングさせ、より難しい物にしたいです。
ホーミングと言っても必ずあたるわけではなく、敵弾の角度とキャラクターの座標を照らし合わせてアングル値に変化を少しづつ加えるというものです。

キャラクターのオプションがもっているホーミング関数を分解して(関数の引数と帰り値の用途がよく理解できなかったため)敵とキャラの立場を総取替えしました。
下記のソースは、それぞれ誘導性能をつけたいshotH.cppの弾幕関数shot_bullet_H001(int n)などの終わりのほうに記入してあります。

「問題点は、敵が弾を撃ってくれない」ということです。
うんともすんともいいません。

コード:

for(int i=0;i<SHOT_BULLET_MAX;i++){
			if(shot[n].bullet[k].flag==1){
				int dranx=(int)(shot[n].bullet[k].spd+11/2),drany=(int)(shot[n].bullet[k].spd+55/2);
				if(shot[n].bullet[k].knd==1){

					double x,y,l_a,l_b;
					x=ch.x-shot[n].bullet[k].x;
					y=ch.y-shot[n].bullet[k].y;	
	
					l_a = (2*PI)/(30);				//一定の角度(曲がる)
					l_b = atan2(y,x) - shot[n].bullet[k].angle;	//敵への角度-弾の角度
					if(cos(l_b) > cos(l_a)){			//もしも「弾の進行方向と敵への角度の差」が「曲がる角度」より大きかったら
						shot[n].bullet[k].angle=atan2(y,x);			//敵への角度を弾の角度へ代入
					}else if(sin(l_b)>0){				//弾の正面ではなく右寄りならば
						shot[n].bullet[k].angle += l_a;			//弾の角度に左向きに修正(angleに一定値を足す)
					}else if(sin(l_b)<0){				//弾の正面ではなく左寄りならば
						shot[n].bullet[k].angle -= l_a;			//弾の角度に右向きに修正(angleから一定値を引く)
					}else{								//弾が正面ならば引き続き誘導
					shot[n].bullet[k].angle=atan2(y,x);
					}
				}
				shot[n].bullet[k].x+=cos(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
				shot[n].bullet[k].y+=sin(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
				shot[n].bullet[k].cnt++;
				shot[n].bullet[k].flag=0;
				}
			}

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#2

投稿記事 by kimuchi » 14年前

bullet[k] → bullet[i]

じゃないですか?for文的に。

LisetteLander

Re: 本館:敵の弾を誘導させるには

#3

投稿記事 by LisetteLander » 14年前

kではなくiでしたね・・・

コード:

void shot_bullet_H001(int n){
	int t=shot[n].cnt;
	int k;
	if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
		if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
			shot[n].bullet[k].knd	=enemy[shot[n].num].blknd2;//弾登録
			shot[n].bullet[k].angle	=shotatan2(n);//角度
			shot[n].bullet[k].flag	=1;//フラグ
			shot[n].bullet[k].x		=enemy[shot[n].num].x;//座標
			shot[n].bullet[k].y		=enemy[shot[n].num].y;
			shot[n].bullet[k].col	=enemy[shot[n].num].col;//色
			shot[n].bullet[k].cnt	=0;//カウンタ
			shot[n].bullet[k].spd	=3;//スピード
			se_flag[0]=1;

//
for(int i=0;i<SHOT_BULLET_MAX;i++){・・・(下記に上記に続く)

LisetteLander

Re: 本館:敵の弾を誘導させるには

#4

投稿記事 by LisetteLander » 14年前

「発射をする」という命令がよくわからないのですが・・・
やはりそれも関係あるのでしょうか?

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#5

投稿記事 by kimuchi » 14年前

それも関係ある、というと具体的にはどういうことでしょうか?

私個人の見解なので間違っているかもしれませんが、
「弾を発射する」ということは「弾情報を登録する」ということだと思います。

LisetteLander

Re: 本館:敵の弾を誘導させるには

#6

投稿記事 by LisetteLander » 14年前

なるほど、そうでしたか

弾が発射されないのは、登録されていないからということですよね・・・

登録する部分はいじっていないのに発射されなくなったということは、発射した瞬間にフラグがなくなった?

匿名希望の774さん

Re: 本館:敵の弾を誘導させるには

#7

投稿記事 by 匿名希望の774さん » 14年前

ブレークポイント使いなさい

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#8

投稿記事 by kimuchi » 14年前

フラグが何らかの原因によって落ちている可能性は十分にあります。(現に私がそうでした)
匿名希望の774さん の仰る通り、VCを使っていればブレークポイントで追っていくのが良いと思います。

他に私の経験から、
弾画像の表示ができていないだけとか、shot_search(n)にはじかれたとか、条件文がおかしいとか、あるかもしれません。
こんなのは私だけかもしれませんが(^^;)

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#9

投稿記事 by kimuchi » 14年前

連投失礼します。
一番上のコードの25行目に、
shot[n].bullet[k].flag=0;
があるのですが、これが原因ではないですか?

LisetteLander

Re: 本館:敵の弾を誘導させるには

#10

投稿記事 by LisetteLander » 14年前

shot[n].bullet.flagを消してみたところ、弾を発射してくれました!

しかし、誘導性能は無いことに・・・


ブレークポイントですか、今はじめて知ったのですが
格納中の変数を表示するもの?ですか、便利そうですね・・・

LisetteLander

Re: 本館:敵の弾を誘導させるには

#11

投稿記事 by LisetteLander » 14年前

自分なりに整理した結果、このようになりました。
弾は撃ちますが、誘導が効かないという状況です。

コード:

//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
	int t=shot[n].cnt;
	int k;
	if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
		if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
			shot[n].bullet[k].knd	=enemy[shot[n].num].blknd2;//弾登録
			shot[n].bullet[k].angle	=shotatan2(n);//角度
			shot[n].bullet[k].flag	=1;//フラグ
			shot[n].bullet[k].x		=enemy[shot[n].num].x;//座標
			shot[n].bullet[k].y		=enemy[shot[n].num].y;
			shot[n].bullet[k].col	=enemy[shot[n].num].col;//色
			shot[n].bullet[k].cnt	=0;//カウンタ
			shot[n].bullet[k].spd	=3;//スピード
			se_flag[0]=1;
		}
	}
//
                if(shot[n].bullet[k].knd==1){
                    double x,y,l_a,l_b;
                    x=ch.x-shot[n].bullet[k].x;
                    y=ch.y-shot[n].bullet[k].y; 
    
                    l_a = (2*PI)/(30);              //一定の角度(曲がる)
                    l_b = atan2(y,x) - shot[n].bullet[k].angle; //敵への角度-弾の角度
                    if(cos(l_b) > cos(l_a)){            //もしも「弾の進行方向と敵への角度の差」が「曲がる角度」より大きかったら
                        shot[n].bullet[k].angle=atan2(y,x);         //敵への角度を弾の角度へ代入
                    }else if(sin(l_b)>0){               //弾の正面ではなく右寄りならば
                        shot[n].bullet[k].angle += l_a;         //弾の角度に左向きに修正(angleに一定値を足す)
                    }else if(sin(l_b)<0){               //弾の正面ではなく左寄りならば
                        shot[n].bullet[k].angle -= l_a;         //弾の角度に右向きに修正(angleから一定値を引く)
                    }else{                              //弾が正面ならば引き続き誘導
                    shot[n].bullet[k].angle=atan2(y,x);
                    }
				shot[n].bullet[k].x+=cos(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
                shot[n].bullet[k].y+=sin(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
				}

//
}

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#12

投稿記事 by kimuchi » 14年前

こちらでも動作確認してみました。
こちらではちゃんと、というかホーミングが強すぎて瞬殺だったんですが・・・?

ブレークポイントに関しては私もそこまで使いこなしているわけではないので詳しくは分かりませんが、
Debug実行前・実行中にVC側で設定しておくと設定した場所で一時停止して、マウスを変数などに重ねると、
その時の値を確認できたり、変更したりできます。

LisetteLander

Re: 本館:敵の弾を誘導させるには

#13

投稿記事 by LisetteLander » 14年前

>>kimuchiさん
本当ですか!?
たった今↑↑のソースでもやってみましたが、誘導してくれませんでした。。

ということは環境の違いなのでしょうか?
ブレークポイントは、敵の弾の角度のほかに どの敵*何番目の弾かまでのアングルも含まれてるので・・・

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#14

投稿記事 by kimuchi » 14年前

環境の違いは弾道計算にまで関わるとは思えないのですが・・・
一応こちらの弾幕関数を丸々載せておきます。

コード:

void shot_bullet_H000(int n){
	int k,i;
	if(shot[n].cnt==0){
		if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
			enemy_shot_ini(n,k);
			shot[n].bullet[k].id	=enemy[shot[n].num].blknd2;
			shot[n].bullet[k].angle	=shotatan2(n);
			shot[n].bullet[k].flag	=1;
			shot[n].bullet[k].x	=enemy[shot[n].num].x;
			shot[n].bullet[k].y	=enemy[shot[n].num].y;
			shot[n].bullet[k].color	=enemy[shot[n].num].col;
			shot[n].bullet[k].cnt	=0;
			shot[n].bullet[k].spd	=3;
			se_flag[0]=1;
		}
	}

	for(i=0;i<SHOT_BULLET_MAX;i++){
		if(shot[n].bullet[i].flag==1){
			int dranx=(int)(shot[n].bullet[i].spd+11/2),drany=(int)(shot[n].bullet[i].spd+55/2);
			double x,y,l_a,l_b;
			x=ch.x-shot[n].bullet[i].x;
			y=ch.y-shot[n].bullet[i].y; 
    
			l_a = (2*PI)/(30);              //一定の角度(曲がる)
			l_b = atan2(y,x) - shot[n].bullet[i].angle; //敵への角度-弾の角度
			if(cos(l_b) > cos(l_a)){            //もしも「弾の進行方向と敵への角度の差」が「曲がる角度」より大きかったら
				shot[n].bullet[i].angle=atan2(y,x);         //敵への角度を弾の角度へ代入
			}else if(sin(l_b)>0){               //弾の正面ではなく右寄りならば
				shot[n].bullet[i].angle += l_a;         //弾の角度に左向きに修正(angleに一定値を足す)
			}else if(sin(l_b)<0){               //弾の正面ではなく左寄りならば
				shot[n].bullet[i].angle -= l_a;         //弾の角度に右向きに修正(angleから一定値を引く)
			}else{                              //弾が正面ならば引き続き誘導
				shot[n].bullet[i].angle=atan2(y,x);
			}
                          shot[n].bullet[i].x+=cos(shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
                          shot[n].bullet[i].y+=sin(shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
		}
	}
}

LisetteLander

Re: 本館:敵の弾を誘導させるには

#15

投稿記事 by LisetteLander » 14年前

おお、ありがとうございます。自分のでも試してみます。
つかぬことなんですが、enemyshot.iniとはなんでしょうか?
色々変数名が変わっていて^^;

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 本館:敵の弾を誘導させるには

#16

投稿記事 by kimuchi » 14年前

返信遅くなりました。

登録の所だけ自分用に改変してたの忘れてました。
申し訳ないです。

登録のところは特に移さなくて大丈夫です(^^;)
やってることは同じなので。

LisetteLander

Re: 本館:敵の弾を誘導させるには

#17

投稿記事 by LisetteLander » 14年前

とりあえずできるようになりました!

そちらのソースと比較すると
どうもif文のループ変数と、実際に弾を操作している変数がうまくかみあってなかったのかと思います。

kimuchiさんには最初から最後まで付き合ってもらい、ものすごい感謝してます!ありがとうございました!

閉鎖

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