私は以前にこの質問をしましたが、プログラミングの質問ではなかったため閉鎖されました。これは完全に私が間違って言ったとおりです。これをJavaに実装したいと思います。私は小さなゲームを作成していて、船からターゲットに向かって発射される光子魚雷を持っています。魚雷の速度が遅いので、ターゲットが動いている場合、船はターゲットに当たることはありません。これを修正したいと思います。私はこれを達成するための最良の方法を見つけるために複数の理論を作成し、多くの数学的なものをマッピングし、最終的に次のことを推測しました。
- 光子魚雷がターゲットに到達するまでにかかる時間を見つけました。
- 魚雷が到着するまでにターゲットがどれだけ移動したかがわかります。
- 次に、ターゲットの新しい位置と元の船の間の距離を見つけます。
- これにより、余弦定理(SSS)を使用して、弾丸が命中する可能性がはるかに高くなるために発射する必要のある弾道を見つける機会が得られます。
これが有向グラフです:
ここで、線aを正しい方向に回転させる必要がある唯一の問題は、デフォルトでは線cに平行であり、方程式全体を台無しにするためです。誰かがこれを手伝うことができますか?また、新しいポジションの提案を見つけるためのより良い方法を考えることができれば、大歓迎です。私のJavaゲームエンティティの仕組みは次のように機能します。
- 各エンティティには、動きを制御する2つのベクトルがあります。位置と速度。ただし、速度は速度と方向ではなく、xSpeedとySpeedであるため、完全に適切に追跡されるわけではありません。
- エンティティはすべてティックごとに1回更新され、魚雷を発射する船は、複数のティックを超えないように、この1ティックで将来の位置を計算する必要があります。
今回はJavaに実装するための答えが本当に必要なので、この質問を二度と閉じないようにお願いします。
これは私がこれまでに試した数学です:
double dis = level.distanceBetween(photonTargetTop, this);
double speed = 5;
double time = dis / speed;
double d1 = photonTargetTop.velocity.x * time;
double d2 = photonTargetTop.velocity.y * time;
double dis2 = level.distanceBetween(this, photonTargetTop.pos.x + d1, photonTargetTop.pos.y + d2);
double dis3 = level.distanceBetween(photonTargetTop, photonTargetTop.pos.x + d1, photonTargetTop.pos.y + d2);
double cosAngle = Math.pow(dis2, 2) + Math.pow(dis, 2) - Math.pow(dis3, 2) / 2 * dis2 * dis;
double angle = Math.acos(cosAngle);
EntityPhoton p = new EntityPhoton(this, level);
p.rotation = angle;
level.addEntity(p, pos);