6

私は小さなJava2Dタワーディフェンスゲームを開発しようとしていますが、ミサイルの使い方を計算しようとして問題が発生しました。何時間もの検索とテストの後、私はさらに混乱しています。

私がこれまでに持っているのは:

  1. タワーが発射されているユニット(NW、NE、SW、SE)に応じて、タワーの位置に応じて4つのケース
  2. を使用して、現在のターゲットとミサイルが到達しているタワーとの間の距離を計算する必要がありMath.sqrt(x2, x1, y2, y1)ます。
  3. ミサイルのxとyをスケーリングします。

今私が遭遇している問題は、ミサイルの増分xとyをターゲットに向かってスケーリングして、現実的に見えるようにする方法です。数学は私の強いスーツではなく、ここに示されています。以下に、タワーからのSE象限に対して私が持っているものを示します。

public int distanceX, distanceY;
public double sep, scale;

if(xBullet < Screen.mobs[shotMob].x && yBullet < Screen.mobs[shotMob].y){
        distanceX = Screen.mobs[shotMob].x- xBullet;
        distanceY = Screen.mobs[shotMob].y - yBullet;
        sep = Math.sqrt( (distanceX * distanceX) + (distanceY * distanceY));
        scale = // This is the part I am confused about.
        xBullet += distanceX * scale;
        yBullet += distanceY * scale;
4

5 に答える 5

3

固定速度が必要な場合は、次を使用します。

scale = someConstant;

弾丸を移動するには、既に見つけた方向ベクトルを使用できますが、距離で割って正規化する必要があります。

xBullet += (distanceX / sep) * scale;
yBullet += (distanceY / sep) * scale; 

基本的に、進みたい方向の速度単位ベクトルを取得し、それを速度に対して乗算して、実際の速度ベクトルを取得します。ただし、 xBulletandyBulletフィールドは、整数ではなく、浮動小数点値 (例: double) である必要があります。

于 2012-07-29T21:11:28.693 に答える
1

I'm going to make a Tower Defence today. I have thought about it and this is how I will shoot from my towers etc.

How to calc distance to target: Pythagorean theorem. x target - x tower for one length of it and y target - y tower for other length of it. Sqr both of them and, add them together and sqr root the number you get. Thats the disatance to target. Although it would need some other code to work properly (you might get lengths in negative values, so you would need to change to to positive again)

condition: if distance to target is less than attack range of tower: action: tower shoots response : create a bullet that has a target fixed on it

loop : compare x and y between target and missile and increase x or y accordingly.

action : missile x and y are same as target x and y response : deal damage to target and remove missile

于 2013-01-24T07:08:51.753 に答える
1

私はあなたの主張を理解するかどうか確信が持てません..お詫び申し上げます。とにかく、次のようなことはできませんでした..

xMissile += (xTarget-xOrigin)/numberOfSteps
yMissile += (yTarget-yOrigin)/numberOfSteps

これは、指定されたステップ数でセグメントを通過して目的地に到達する簡単な方法です

于 2012-07-29T21:08:17.673 に答える
0

今、私が直面している問題は、ミサイルの増加する x と y をターゲットに向かってスケーリングする方法で、現実的に見えるようにする方法です。

これはどの程度現実的である必要がありますか?

私はミサイルの専門家ではありませんが、一度発射された単純なミサイルは、一定の方向と速度で近似できると思います。その後、何かに衝突するか、燃料がなくなるか、重力によって倒されるまで、その方向に進み続けます。ミサイルが発射されると、その方向と速度を保存し、各ステップで適切な一定距離だけミサイルを移動できます (三角関数の公式を使用して x 座標と y 座標に変換できます)。

double delta_distance = speed * delta_time;
double delta_x = Math.cos(angle) * delta_distance;
double delta_y = Math.sin(angle) * delta_distance;

コメントで指摘されているように、角度と速度を別々に保存する代わりに、速度ベクトルを使用することを選択できます。

マイナーノート: 一定の速度は、いくつかの理由から近似値にすぎません。ミサイルが最初に発射されたとき、推進力が空気抵抗による抗力と等しくなるまで加速する必要があります。また、燃料が燃え尽きると、同じ力で質量が小さくなるため、実際にはより速く移動できる可能性があります。しかし、タワー ディフェンス ゲームでは、このレベルの詳細は必要ありません。一定の速度は合理的な単純化です。

ターゲットが素早く移動し、方向を変える可能性がある場合、ミサイルがしばしばターゲットを逃す可能性があるため、このアルゴリズムはうまく機能しないと思います。

より高度な熱探知ミサイルは、目標にロックオンして追跡することができます。ターゲットが移動したときに方向を変えることができる必要がありますが、おそらく速度を調整しないと思います. また、物理的な制約により、方向を変える速度も制限されるため、それもモデル化する必要があります。そうしないと、ミサイルがターゲットを通り過ぎて飛んでいき、突然反転して、最初に減速したり方向転換したりせずにすぐに反対方向に飛んでしまう可能性があります。これはあまり現実的ではありません。

高度なミサイルは、現在の速度に基づいてターゲットが移動する場所を予測しようとする場合があります。彼らは、ターゲットの現在の軌道がミサイルの計算された軌道と衝突するような経路を計算します。ターゲットの動きが変化した場合、この計算を更新する必要があります。明らかに、これを実装するのは少し難しくなりますが、プレイヤーはモンスターを爆破することを楽しみたいと考えていることを忘れないでください。すべてのミサイルが目標を外し続けると、彼らはあまり楽しくありません。したがって、ミサイルが現実的効果的であることを確認するために少し余分な作業を行うと、ゲームが改善されます.

于 2012-07-29T21:06:10.657 に答える
0

別々の x スケールと y スケールが必要になります。xスケールは、銃からターゲットまでの水平距離を、命中する前のアニメーションの合計フレームで割ったものである必要があり、yスケールは同じですが、垂直距離になります

于 2012-07-29T21:10:29.050 に答える