我目前正在使用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,theta和totalFlightTime),只有2个方程?
感谢您的时间。
答案 0 :(得分: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不会提供真正的解决方案。