敵を追うミサイル
投稿者 : R.Sato(61.126.88.206)
- 2006/06/09(Fri) 15:01
No.9921
|
|
|
|
|
R.Satoです。いま、敵を追うミサイルを作っているの ですが複数の同じキャラが出ると止まったり、変な方 向に飛んでってしまいます。どうすればいいでしょう か?
|
Re: 敵を追うミサイル
投稿者 : tava(222.107.113.221.ap.yournet.ne.jp)
- 2006/06/09(Fri) 22:16
No.9922
|
|
|
|
ミサイルやホーミング、追尾と検索すると結構出てきますよ。 そのなかから一番いいプログラムを見つけたほうがいいかもしれません。
|
Re: 敵を追うミサイル
投稿者 : ごま太郎(i60-35-192-166.s02.a002.ap.plala.or.jp)
- 2006/06/10(Sat) 08:33
No.9923
|
|
|
|
一度、ターゲットを設定したらそのターゲットが変わらないように変数(配列がいいかな?)に代入し、そのミサイルは変数のデータのみを参照して飛ぶようにプログラムするといいと思います。 追尾するためには、ターゲットの座標変化ぐらいは追わなくてはいけませんが…。
|
Re: 敵を追うミサイル
投稿者 : R.Sato(61.126.88.206)
- 2006/06/20(Tue) 12:12
No.9957
|
|
|
|
配列とかよく分かりません。ミサイルのサンプルを 紹介してくれるとありがたいのですが。
|
Re: 敵を追うミサイル
投稿者 : 大月(55.251.192.61.east.flets.alpha-net.ne.jp)
- 2006/06/20(Tue) 21:16
No.9958
|
|
|
|
敵キャラが1体のときなら正常に追尾できるミサイルが出来ているという前提で、あとは発射時に敵のどれかをロックオンしておけば良いわけです。 発射時(ミサイルがメインループに入る前)に、たとえば target という変数を用意して追尾したい敵キャラを代入しておき、ループ中ではtarget.x や target.y を参照して追尾するようにすればうまく行くと思います。 大体こんなかんじになるのではないでしょうか。
target=<追尾したい敵キャラ>; while(1) <追尾処理> }
|
Re: 敵を追うミサイル
投稿者 : ごま太郎(i219-165-174-70.s02.a002.ap.plala.or.jp)
- 2006/06/20(Tue) 21:33
No.9959
|
|
|
|
アップロード板のサンプルをごどうぞ。 ちなみに、私自身は自分で納得のいくレベルのミサイルサンプルが作れないのでご了承ください。 ttp://tonyu.kake.info.waseda.ac.jp/project/pages/viewProject.cgi?mainkey=179&
ttp://tonyu.kake.info.waseda.ac.jp/project/pages/viewProject.cgi?mainkey=205&
などなど。旧アップ板にもサンプルがあります。
|
例えば
投稿者 : 迦葉(ZR182247.ppp.dion.ne.jp)
- 2006/06/20(Tue) 23:22
No.9961
|
|
|
|
一番近い敵に向かって飛んでいくのであれば
range=100000; target=null;
for(t in $chars){if(t is 目標の名前 && dist(x-t.x,y-t.y)<range){target=t;range=dist(x-t.x,y-t.y);}}
if(x<t.x){x++;}else{x--;} if(y<t.y){y++;}else{y--;}
で、ゆーっくり敵に進んでいくのが出来る・・・ハズです。 ただし、周りにいる敵にまんべんなく当てるのであれば配列は必須です。分からない場合、一度どんなものか調べてみたら、為になるかもしれませんし。
|
Re: 敵を追うミサイル
投稿者 : ASH(FLH1Aci040.osk.mesh.ad.jp)
- 2006/06/21(Wed) 21:29
No.9962
|
|
|
|
私はいつも下のような誘導弾を使っています。 Enemyクラスを作って、カーソルキーで逃げれるようにすると この弾の追尾特性がよくわかります。 (l,rは、追尾弾が旋回する軌道の内側に入ると弾が目標の周りを周るだけになってしまう欠点を解消するためです)
spd=10; tar=null;//目標初期化 for (target in $chars) {//目標設定 if(target is Enemy){ if(target2!=null){ if(dist(target.x-x,target.y-y)<dist(tar.x-x,tar.y-y))tar=target; }else tar=target; }//tarは攻撃目標 else {if (target is Enemy)tar=target;} } t=0; while(t<6000){弾の寿命 t++; if(angleDiff(a,$math.angle(tar.x-x,tar.y-y))>0) {a-=2+l/100;l++;r=0;} if(angleDiff(a,$math.angle(tar.x-x,tar.y-y))<0) {a+=2+r/100;r++;l=0;} s=spd*cos(a); c=spd*sin(a); x+=s; y+=c; angle=a; if(k>0){//ここから d2x=dx; d2y=dy; dx=x; dy=y; k-=10; } drawLine(x,y,dx,dy,color(200,200,200),0); drawLine(dx,dy,d2x,d2y,color(200,200,200),0);
k++;//ここまで軌跡のおまけつき update(); }
|
|