我正在制作一个游戏,应该有一个机器人向另一个机器人投掷球形物体。
投掷的球应该以对称弧形飞行。很确定这个数学词是一个抛物线。
两个机器人都在x轴上。
我如何在游戏中实现这样的功能?我尝试了不同的方法,没有用。
我游戏中当前的移动物体系统是这样的:每个物体都有x
和y
坐标(变量),dx
和dy
变量
每个对象都有一个move()
方法,可以在游戏循环的每个循环中调用。它只是将dx
添加到x
,将dy
添加到y
。
如何将我所描述的内容实施到此系统中?
如果涉及到很多数学,请尝试以简单的方式解释,因为我对数学不太满意。
我的情况:
非常感谢
答案 0 :(得分:6)
你应该将速度添加到你的导弹中。
速度是一个矢量,这意味着它表示导弹在x轴上的移动速度和y轴的移动速度。现在,不要使用Move()
使用类似Update()
的内容。像这样:
void Update()
{
position.X += velocity.X;
position.Y += velocity.Y;
}
现在让我们想一想,一旦射击,导弹会发生什么:
一开始它有一些起始速度。例如,有人以x为1 m / s的速度射击导弹,y为-0.5 m / s。然后当它归档时,导弹将被拉到地面 - 它的Y速度将朝向地面增长。
void Update()
{
velocity.Y += gravity;
position.X += velocity.X;
position.Y += velocity.Y;
}
这将使你的导弹相应地移动物理(不包括空气阻力)并产生漂亮的抛物线。
修改强> 您可能会问如何计算初始速度。让我们假设我们有一个给定的射击角度(射击线和地面之间),以及最初的速度(我们可能知道射击后导弹有多快,只是不知道X和Y值)。然后:
velocity.X = cos(angle) * speed;
velocity.Y = sin(angle) * speed;
答案 1 :(得分:1)
根据Michal的回答,为了确保导弹击中机器人(如果你想让它跟踪机器人),你需要调整它的x速度。
void Update()
{
ball.dy += gravity; // gravity = -9.8 or whatever makes sense in your game
ball.dx = (target.x - ball.x); // this needs to be normalized.
double ballNorm = sqrt(ball.dx^2 + ball.dy^2);
ball.dx /= ballNorm;
ball.x += ball.dx;
ball.y += ball.dy
}
这会导致导弹追踪你的目标。 Normalizing向量的x分量可确保它永远不会高于1的速度。它也没有完全“标准化”向量,因为通常你也必须对y组件执行此操作。如果我们没有在这里进行标准化,我们最终会在第一次更新时将球一直跳到目标。如果你想让你的导弹行进更快,只需将ballNorm
乘以一定量。
答案 2 :(得分:0)
你可以从这几个方程中得到你需要的每一件东西 最大高度到距离的时间。
g = gravity
v = start vorticity M/S
a = start angle deg
g = KG of object * 9.81
time = v*2 * sin(a) / g
range = v^2 * sin(a * 2) / g
height = v^2 * sin(a)^2 / 2*g