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(theta) * totalFlightTime

  • Y = V0 * sin(theta) * totalFlightTime - 0.5 * g * totalFlightTime^2

其中 X 和 Y 是我要击中的玩家的坐标,V0 是初始速度,theta 是发射火箭的角度,totalFlightTime 顾名思义,就是火箭到达它之前的总飞行时间(X , Y) 和 g 是重力(在我的游戏中是 400)。

问题:

我遇到的问题是知道在这些公式中添加风的位置(是否只是在 X = 方程中添加“+ windDirection * totalFlightTime”?),以及如何处理这些方程以执行我的操作想要做(找到初始速度和θ角),因为有3个变量(V0,θ和totalFlightTime)并且只有2个方程?

谢谢你的时间。

4

1 回答 1

1

您可以按如下方式执行此操作:

假设 V0 没有特定限制(即机器人可以以任何所需速度发射火箭)并使用替换

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

为 Vx 选择任意值。现在你的第一个方程简化为

X=VxT  so T=X/Vx

求解 T。现在将 T 的值代入第二个方程并求解 Vy

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

最后,您现在可以求解 V0 和 theta

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

请注意,您最初选择的 Vx 将决定导弹的轨迹 - 如果 Vx 大,则 T 将小,并且轨迹几乎是一条直线(就像向附近目标发射的子弹) - 如果 Vx 小,则T 将很大,并且轨迹将是弧线(如迫击炮弹的路径)。您从三个变量(V0、totalFlightTime 和 theta)开始,但它们是因变量,因此选择任何一个(或在本例中为 Vx)加上这两个方程可以求解另外两个。您还可以预先确定飞行时间并求解 Vx、Vy、theta 和 V0,或预先确定 theta(尽管这会很棘手,因为某些 theta 无法提供真正的解决方案。

于 2013-05-23T01:27:47.690 回答