本編のオプションのホーミング弾の誘導について

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

本編のオプションのホーミング弾の誘導について

#1

投稿記事 by LisetteLander » 14年前

//一番近い敵を探して角度をセットする
void calc_homing(int k){
int i,d, num=-1, min=-1;
double x,y;
if(boss.flag==0){//ボスが居ない時
for(i=0;i<ENEMY_MAX;i++){//敵の総数分
if(enemy.flag==1){
x=(enemy.x-cshot[k].x);
y=(enemy.y-cshot[k].y);
d=(int)(x*x+y*y);//ショットと敵の距離
if(d<min || min==-1){//計算結果が最小値かまだ格納していないなら
num=i;//番号記録
min=d;//距離記録
}
}
}
}
//近い敵が見つかったら、あるいはボスがいて、HPがあるときは角度をセット
if(num!=-1 || boss.flag==1 && boss.hp>0){
if(boss.flag==0){
x=enemy[num].x-cshot[k].x;
y=enemy[num].y-cshot[k].y;
}
else{
x=boss.x-cshot[k].x;
y=boss.y-cshot[k].y;
}
cshot[k].angle=atan2(y,x);
}
}

本編のcshot.cからコピーしたものです。
このプログラムだと、たとえばボスがx=0,y=0にいて、弾の発射位置がx=1,y=1で
弾の発射方向(angle)が-y方向にしかないとしても、直線状にホーミングしてしまいます。
これを、なめらかに、例ていうと扇状に誘導していき、ボスのy軸を下回ったら
誘導を停止するというプログラムにするにはどうしたらいいのでしょうか?

else{
x=boss.x-cshot[k].x;
y=boss.y-cshot[k].y;
}
の部分でいろいろ試しましたが、できませんでした。

①必ずあたらなくてもいいです。一定の湾曲値で敵の方向に弾が曲がり、既存の角度になったら直線に飛んでいくというプログラム
②自分からみて真横に発射された弾が、発射された時のボスの位置に円状に綺麗に曲がる誘導弾

②は後学のためだけですが、もしよろしければ教えてもらえないでしょうか?

ISLe

Re:本編のオプションのホーミング弾の誘導について

#2

投稿記事 by ISLe » 14年前

> cshot[k].angle=atan2(y,x);

そのまま代入しないで、cshot[k].angleの元の値とatan2(y,x)の値を比較して回転方向(プラスマイナス)を求めて、一定値を加算(あるいは減算)すれば良いと思います。
(追記)一定値(の絶対値)が小さいほど大きな弧を描くことになります。

①の「既存の角度になったら直線に飛んでいく」の既存の角度というのがよく分からないですが、例えば弾にカウンタを追加して減算しつつ0になるまで誘導する、とすると一定時間追いかけるというふうにできます。
画像

LisetteLander

Re:本編のオプションのホーミング弾の誘導について

#3

投稿記事 by LisetteLander » 14年前

返答ありがとうございます。遅れて申し訳ありません。

既存の角度・・・つまり発射されて飛んでいる弾から目標地点への角度と、今現在弾が動いているベクトルが重なったら(曲がる必要がなくなったら)
誘導を停止し、それ以後誘導しないようにするというものです。
わかりにくくてすいません。


それと
cshot[k].angleというか、angleの角度が何周期で一周するのかがわかりません。
たとえば、これが弾の発射向きだとして(ゲーム内では)-PI/2で垂直上を向いている状態なのですが
例えばこれに2を足すとゲーム内では大体4時の方向を向いてしまいます。
また、7を足すと一周回って2時の方向です。
何回か試しましたが、180で綺麗に一周するわけでもなく、360や256や126や手当たりしだい試しましたがわかりませんでした。

ソースを見ていると変数を直接代入しているので使い方が元から違うと思いますが・・

えっと、一言でいうと、cshot[k].angleの元の値とatan2を比べられますか?
atanのほうを計算して、tanを導き比べればいいのでしょうか?

LisetteLander

Re:本編のオプションのホーミング弾の誘導について

#4

投稿記事 by LisetteLander » 14年前

すいません、そのままの意味でしたね・・深く考えすぎました。

ISLe

Re:本編のオプションのホーミング弾の誘導について

#5

投稿記事 by ISLe » 14年前

元はそのまま代入しているくらいですから比較できます。
角度はラジアンという単位で一周はPI*2です。

閉鎖

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