HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0803
Cross『先読み撃ち』の計算式5解決


Cross

リンク

2006/8/3(Thu) 02:01:42|NO.1735

全方向シューティングゲーム等で、攻撃対象のオブジェクトが同じ速度,同じ方向に移動していると仮定した場合、
ある一定の速度で移動する弾頭で『先読み』させて発射方向を決める計算式はどのようにすればいいのでしょうか。

例えば、攻撃対象のオブジェクトの方向に発射するだけであれば[発射方向=atan(対象X座標-発射源X座標,対象Y座標-発射源Y座標)]で良いですよね。
(もちろんこの場合の弾頭の移動は[弾頭X座標+=sin(発射方向)][弾頭Y座標+=cos(発射方向)])という具合で。)
しかしこの場合、攻撃対象のオブジェクトが移動していると特別な事情がない限り必ず当たらないですよね。
そこで攻撃対象のオブジェクトの座標、移動方向、移動速度、弾頭の座標、移動速度を利用して先読みさせられるのではないだろうかと考えたのですが、
自分で考えても、ネットで色々探してみても方法が分かりませんでした。

よろしくお願いします。



この記事に返信する


cbird

リンク

2006/8/3(Thu) 11:02:05|NO.1744

おおざっぱですが考え方です、参考になるとよいのですが。

1、何フレーム後かを想定する
敵との距離を測り、それを弾の速度で割ります。
それにより何フレーム後を予想すればよいかを想定します。

2、予想する敵の移動速度、移動角度、速度変化、角度変化を計算する
敵の位置情報をストックしておき(配列などで)それにより敵の行動を予想します。
現在の位置、1フレ前の位置により、最後の敵の速度、移動角度が算出できます。
この計算を過去にさかのぼることで、速度の変化、移動角度の変化を出すことができます。

3、敵の予想位置を計算する
敵の位置から1で出したフレームの数だけ、移動変化と角度変化をさせた場所が、敵の
予想位置です。そこにむかって弾を撃てば先読み撃ちです。
精度は距離が伸びるほど落ちますし、2を手抜きすればするほど落ちます。
(簡単な変化の数値ではなくカーブとして計算するとより精度があがります)

処理速度に余裕があれば1の処理を後にして、敵の予想位置をあつ程度のフレーム先を全
て出し。一番距離もフレームも近い場所に撃つとより精度があがります。



うひょ

リンク

2006/8/3(Thu) 12:14:36|NO.1748

自分でも良く分からないのですが、

dx=tekix-x : if dx<0 : dx=-dx ;tekixが敵のx座標、xが自機のx座標 dy=tekiy-y : if dy<0 : dy=-dy ;上のy版 v=5 ;弾の移動距離 ky = sqrt(dx*dx+dy*dy)/v ux=x+自機の1フレームごとのx移動量*ky ;自機の移動量は uy=y+自機の1フレームごとのy移動量*ky ;自分で入れてください ky = atan(ux-tekitamax.cnt,uy-tekitamay.cnt) tamax += sin(ky)*v ;tamaxが弾のx座標 tamay += cos(ky)*v ;上のy版
これで出来ました。
自分でも作りたいと思ってたので、作ったらできました。



Cross

リンク

2006/8/3(Thu) 12:37:38|NO.1750

cbirdさん、うひょさん、ありがとうございます。
やはり何フレームか後の座標を測定してその方向に撃たせるという手法しか無いようですね・・・
cbirdさんの「現在距離から求める・・・」というアイデアも自分で試してみたのですが、
発射源に近づいてくる移動方向の場合と発射源から遠ざかる移動方向の場合で適切な発射方向とのズレが大きく断念していました。
何か物理学的な画期的計算方法でもあればいいな、と思ったのですがそれはさすがに高望みしすぎでしたね。
お二人に挙げてもらったアイデアに自己流の工夫を加えつつがんばりたいと思います。
本当にありがとうございました。



Cross

リンク

2006/8/3(Thu) 20:23:18|NO.1763

解決したにも関わらず何も結果をスレッドに残さないのはまずいと思って、色々試していたところ自己流の計算式が完成しました。
目標物と弾頭が同じ速度だった場合、発射源と目標物との間の辺を含めた二等辺三角形の頂点に発射すればいいので、
それを応用させて速度の比を反映させてみたところ下のような式になりました。
完璧な計算式ではないのですが、参考程度にはなるのではないかと考えて掲載させていただきました。


a=double(atan(ex-px,ey-py));px,py=発射源座標 ex,ey=目標物座標 b=double(atan(px-ex,py-ey)-ez);ez=目標物移動方向 c=double(sin(b)*es/ws);es=目標物移動速度 ws=弾頭移動速度 wz=double(a+c);wz=弾頭移動方向



大陸システム

リンク

2006/8/3(Thu) 21:02:30|NO.1767

まあ、こういうことってあることですよね。
何か上手な方法を簡単に示してくれることを期待して、ダメで、
本気で自分で考えた方が良い方法が出来るってことが。



ONION software Copyright 1997-2023(c) All rights reserved.