ページ 1 / 1
本館:敵の弾を誘導させるには
Posted: 2010年12月19日(日) 20:40
by LisetteLander
敵の弾をホーミングさせ、より難しい物にしたいです。
ホーミングと言っても必ずあたるわけではなく、敵弾の角度とキャラクターの座標を照らし合わせてアングル値に変化を少しづつ加えるというものです。
キャラクターのオプションがもっているホーミング関数を分解して(関数の引数と帰り値の用途がよく理解できなかったため)敵とキャラの立場を総取替えしました。
下記のソースは、それぞれ誘導性能をつけたい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;
}
}
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月19日(日) 20:49
by kimuchi
bullet[k] → bullet[i]
じゃないですか?for文的に。
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 17:15
by LisetteLander
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++){・・・(下記に上記に続く)
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 17:23
by LisetteLander
「発射をする」という命令がよくわからないのですが・・・
やはりそれも関係あるのでしょうか?
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 19:03
by kimuchi
それも関係ある、というと具体的にはどういうことでしょうか?
私個人の見解なので間違っているかもしれませんが、
「弾を発射する」ということは「弾情報を登録する」ということだと思います。
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 19:15
by LisetteLander
なるほど、そうでしたか
弾が発射されないのは、登録されていないからということですよね・・・
登録する部分はいじっていないのに発射されなくなったということは、発射した瞬間にフラグがなくなった?
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 19:25
by 匿名希望の774さん
ブレークポイント使いなさい
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 19:46
by kimuchi
フラグが何らかの原因によって落ちている可能性は十分にあります。(現に私がそうでした)
匿名希望の774さん の仰る通り、VCを使っていればブレークポイントで追っていくのが良いと思います。
他に私の経験から、
弾画像の表示ができていないだけとか、shot_search(n)にはじかれたとか、条件文がおかしいとか、あるかもしれません。
こんなのは私だけかもしれませんが(^^;)
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 19:53
by kimuchi
連投失礼します。
一番上のコードの25行目に、
shot[n].bullet[k].flag=0;
があるのですが、これが原因ではないですか?
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 21:10
by LisetteLander
shot[n].bullet.flagを消してみたところ、弾を発射してくれました!
しかし、誘導性能は無いことに・・・
ブレークポイントですか、今はじめて知ったのですが
格納中の変数を表示するもの?ですか、便利そうですね・・・
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 21:37
by LisetteLander
自分なりに整理した結果、このようになりました。
弾は撃ちますが、誘導が効かないという状況です。
コード:
//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;
}
//
}
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月20日(月) 21:57
by kimuchi
こちらでも動作確認してみました。
こちらではちゃんと、というかホーミングが強すぎて瞬殺だったんですが・・・?
ブレークポイントに関しては私もそこまで使いこなしているわけではないので詳しくは分かりませんが、
Debug実行前・実行中にVC側で設定しておくと設定した場所で一時停止して、マウスを変数などに重ねると、
その時の値を確認できたり、変更したりできます。
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月21日(火) 14:52
by LisetteLander
>>kimuchiさん
本当ですか!?
たった今↑↑のソースでもやってみましたが、誘導してくれませんでした。。
ということは環境の違いなのでしょうか?
ブレークポイントは、敵の弾の角度のほかに どの敵*何番目の弾かまでのアングルも含まれてるので・・・
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月21日(火) 15:40
by kimuchi
環境の違いは弾道計算にまで関わるとは思えないのですが・・・
一応こちらの弾幕関数を丸々載せておきます。
コード:
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;
}
}
}
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月21日(火) 16:46
by LisetteLander
おお、ありがとうございます。自分のでも試してみます。
つかぬことなんですが、enemyshot.iniとはなんでしょうか?
色々変数名が変わっていて^^;
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月21日(火) 20:53
by kimuchi
返信遅くなりました。
登録の所だけ自分用に改変してたの忘れてました。
申し訳ないです。
登録のところは特に移さなくて大丈夫です(^^;)
やってることは同じなので。
Re: 本館:敵の弾を誘導させるには
Posted: 2010年12月22日(水) 08:08
by LisetteLander
とりあえずできるようになりました!
そちらのソースと比較すると
どうもif文のループ変数と、実際に弾を操作している変数がうまくかみあってなかったのかと思います。
kimuchiさんには最初から最後まで付き合ってもらい、ものすごい感謝してます!ありがとうございました!