如何使对象在弧形路径中移动?

时间:2014-01-26 19:34:13

标签: math game-physics 2d-games

我正在制作一个游戏,应该有一个机器人向另一个机器人投掷球形物体。

投掷的球应该以对称弧形飞行。很确定这个数学词是一个抛物线。

两个机器人都在x轴上。

我如何在游戏中实现这样的功能?我尝试了不同的方法,没有用。

我游戏中当前的移动物体系统是这样的:每个物体都有xy坐标(变量),dxdy变量

每个对象都有一个move()方法,可以在游戏循环的每个循环中调用。它只是将dx添加到x,将dy添加到y

如何将我所描述的内容实施到此系统中?

如果涉及到很多数学,请尝试以简单的方式解释,因为我对数学不太满意。

我的情况:

enter image description here

非常感谢

3 个答案:

答案 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