1

私は現在、XNA 4.0 で小さなターン ベースの大砲ゲームを行っています。ゲームは非常にシンプルです。プレーヤーは、ロケットを発射したい速度と角度を選択して、別のプレーヤーを攻撃します。ロケットの X 軌道に影響を与える、ランダムに生成された風のベクトルもあります。AI を追加して、プレーヤーがシングル プレーヤー モードでコンピューターと対戦できるようにしたいと考えています。

私が AI を実装したい方法は非常に単純です: ロケットがプレイヤーに直接当たる速度と角度を見つけ、それらのフィールドにランダムな修飾子を追加して、AI が毎回別のプレイヤーに当たらないようにします。

これは、ロケットの位置と速度を更新するために使用するコードです。

            Vector2 gravity = new Vector2(0, (float)400);   // 400 is the sweet spot value that i have found works best for the gravity
            Vector2 totalAcceleration = gravity + _terrain.WindDirection;
            float deltaT = (float)gameTime.ElapsedGameTime.TotalSeconds; // Elapsed time since last update() call

            foreach (Rocket rocket in _instantiatedRocketList)
            {
                rocket.RocketSpeed += Vector2.Multiply(gravity, deltaT);  // Only changes the Y component
                rocket.RocketSpeed += Vector2.Multiply(_terrain.WindDirection, deltaT);   // Only changes the X component
                rocket.RocketPosition += Vector2.Multiply(rocket.RocketSpeed, deltaT) + Vector2.Multiply(totalAcceleration, (float)0.5) * deltaT * deltaT;

                // We update the angle of the rocket accordingly
                rocket.RocketAngle = (float)Math.Atan2(rocket.RocketSpeed.X, -rocket.RocketSpeed.Y);

                rocket.CreateSmokeParticles(3);
            }

最終的な X 座標と Y 座標を見つけるための基本的な方程式は次のとおりです。

  • X = V0 * cos(シータ) * totalFlightTime

  • Y = V0 * sin(シータ) * 合計飛行時間 - 0.5 * g * 合計飛行時間^2

ここで、X と Y は攻撃したいプレイヤーの座標、V0 は初速度、theta はロケットが発射される角度、totalFlightTime は名前が示すように、ロケットが到達するまでの総飛行時間 (X 、Y)、g は重力 (私のゲームでは 400) です。

質問:

私が問題を抱えているのは、これらの式のどこに風を追加するか (X = 式に "+ windDirection * totalFlightTime" を追加するだけですか?) を知っていることです。 3 つの変数 (V0、theta、および totalFlightTime) と 2 つの方程式しかないので、(初速度とシータ角度を見つける) したいですか?

御時間ありがとうございます。

4

1 に答える 1

1

これは次のように行うことができます。

V0 に特定の制限がないと仮定すると (つまり、ロボットは任意の速度でロケットを発射できます)、代替を使用します。

T=totalFlightTime 
Vx=V0cos(theta)
Vy=V0sin(theta)

Vx の任意の値を選択します。最初の方程式は次のように単純化されます

X=VxT  so T=X/Vx

T について解きます。次に、T の値を 2 番目の方程式に代入し、Vy について解きます。

Y=VyT + gT^2/2  so Vy = (Y - gT^2/2)/T

最後に、V0 とシータを解くことができます

V0 = Sqrt(Vx^2 + Vy^2)  and Theta = aTan(Vy/Vx)

最初に選択した Vx によって、ミサイルの軌道が決まることに注意してください。Vx が大きい場合、T は小さくなり、軌道はほぼ直線になります (近くのターゲットに向けて発射された弾丸のように)。Vx が小さい場合は、 T は大きくなり、弾道は弧になります (迫撃砲の弾道のように)。3 つの変数 (V0、totalFlightTime、theta) から始めますが、これらは従属変数であるため、いずれか 1 つ (この場合は Vx) と 2 つの方程式を選択すると、残りの 2 つの方程式が解かれます。また、飛行時間を事前に決定し、Vx、Vy、シータ、および V0 を解くか、シータを事前に決定することもできます (ただし、一部のシータは実際の解を提供しないため、これは注意が必要です)。

于 2013-05-23T01:27:47.690 に答える