2013-04-29 42 views
2

我正在与我申请重力一个对象的简单应用..速度基于时间,而不是FPS

我不希望对象走得太快/太慢当FPS率的变化,所以我四处寻找一种方法来做到这一点,我发现我需要将运动的速度乘以德尔塔时间..

所以我决定去为它,但我碰到了更多比我的预期..

在游戏循环的问题我有这样的:

gravityRate = 0.02; 
velocity.y += gravityRate; 
objectPosition.y -= velocity.y; 

这当然受到了游戏的fps的影响。

我希望对象移动0.02个单位16毫秒,

所以,我试图修复它,像这样:

velocity.y += (gravityRate * (delta * 1000.0))/(1000/60); 

虽然三角洲* 1000给我传递的毫秒量..

到目前为止,它似乎能够正常工作,并且物体以相同的速度移动,即使在较低的FPS上,它也会跳出更大的间隙,但这很好。

问题是我想在某些场合跳回来。如碰撞等, 我曾经通过简单地做这样的事情: velocity.y = -0.05;

但现在这不起作用,它工作正常,但它再次依靠fps。 在较高的FPS率下跳高,在低FPS率下较低。我认为这可能是因为多次呼叫会聚并降低速度超过预期,但情况并非如此,它只运行一次。)

我一直在试图解决它一段时间,但我不断收到更多的问题,因为我去..所以我真的很感谢所有帮助

谢谢

+0

这也取决于你用作3d/2D显示器的内容,以及你用来渲染它的内容。这就是说你可以不预先计算位置/速度/加速度的值,然后根据这些值呈现时间轴? – Nomad101 2013-04-29 00:39:46

+0

@ Nomad101我有一种感觉,我会遇到同样的问题,我会用这种方式去做,我有一种感觉,为了让它跳跃,我需要改变我做的方式,但我不能为此提出一个想法,并且可以扩展关于预计算的内容吗?我不知道我看到你要去哪里,这个 – Radicate 2013-04-29 00:45:44

+0

好吧,从我收集的东西中,你试图对物体进行动画模拟重力。这就是说你动画的对象高度依赖于你如何渲染它。至于预先计算,我的意思是你可以根据你的重力和任何你想实现的碰撞创建一个对象的地图。一旦生成地图,您可以基于此进行渲染,并且您将在应该出现的时候确切地返回它应该在的位置。 – Nomad101 2013-04-29 00:48:20

回答

1

计算基于时间你都速度和位置是这样的:

deltaTime = currentTime - timeLastFrame // time sins last frame 
velocityDelta = deltaTime * gravityRate // velocity change 

// calculate new position with only half of the velocity change this frame 
objectPosition.y -= (velocity.y + (velocityDelta/2)) * deltaTime 
velocity.y += velocityDelta 

鳞片需要根据你的游戏设置进行调整英格斯。


编辑:

所以在细节 - 首先我们要知道自去年多少时间已经发生:

deltaTime = currentTime - timeLastFrame // time sins last frame 

随着速度不断随时间增加,我们需要来计算它自上一帧以来增加了多少。从上一帧开始的时间越长,速度变化越大,我们将它与增量时间相乘。

velocityDelta = deltaTime * gravityRate // velocity change 

为了计算该对象有多少帧期间移动,在该帧中的平均速度被计算。这等于初始速度:velocity.y加上最终速度:velocity.y + velocityDelta除以2。总之,这可以写成(velocity.y + (velocityDelta/2))

objectPosition.y -= (velocity.y + (velocityDelta/2)) * deltaTime 

要准备下一个框架,我们还需要更新速度:

velocity.y += velocityDelta 
随着平均速度,我们就可以通过与框架的增量时间乘以移动的对象
+0

我试过了,但我仍然遇到与跳跃相同的问题本身,同样的机会,我可以问你期望三角洲持有什么?因为我编码的地方没有现成的编码,所以我基本上每次都会节省时间,以毫秒为单位 – Radicate 2013-04-29 01:13:09

+0

我期望Delta是自上一帧以来的时间。 – 2013-04-29 01:25:57

+0

如果你想跳回去,你也应该在'objectPosition.y'上正确地做这件事。这样,它将始终提供与帧速率无关的相同数量。 – 2013-04-29 01:29:26

相关问题