私は現在、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 つの方程式しかないので、(初速度とシータ角度を見つける) したいですか?
御時間ありがとうございます。