游戏是否只​​依赖帧速率?

时间:2009-05-23 18:34:20

标签: collision-detection

我想了解你对这个问题的建议......

为简单起见,我只考虑x轴。

图像位置10的对象,其宽度也是10个单位,每秒向前移动100个单位,由于帧数较低,每次更新时它应移动80个单位。

在调用第一个更新后,它的位置现在为90,并且在位置120中有另一个相同大小的对象。

下一次更新,将对象移动到位置170.考虑到我需要实现碰撞检测,在Update之前或之后计算碰撞,没有一个会起作用。

现在出现一个简单的问题......

在这种情况下该怎么办?

做类似的事情:

Position start = destinationPos - currentPos;
for (int i; i < start; i++)
    if (IsColliding(movingObj.Position + i, staticObj))
        //do the colliding stuff here

我不喜欢这个解决方案,对于这种情况可能没问题,但如果你有x,y,z和很多移动物体怎么办?

我认为另一种解决方案是好的,但我不确定它是否可靠,是让另一个线程在循环中完成所有这些计算。

这个线程就像一个无限循环,在每次迭代时我会计算elapsedTime,我认为它会非常小,并继续移动并计算碰撞,以及渲染线程,这将是很多更慢,将获得对象的当前状态并只渲染它。

你们的想法是什么?

3 个答案:

答案 0 :(得分:7)

这是一个问题,幸运的是,我们数学傻瓜,或多或少已经解决了。您所描述的问题是通过动态碰撞检测解决的,它用于确定两个对象是否在帧之间发生碰撞,并且对于某些类型的碰撞甚至可以确切地告诉您何时发生了碰撞,因此您可以正确更新世界状态。

如果您对自己实现碰撞检测算法不是特别感兴趣,我会考虑使用已经完成此类操作的库:

关于这个主题的许多好书之一是Real Time Collision Detection

答案 1 :(得分:4)

迈克丹尼尔斯谈到了这一点,但你的回答是否定的:你不想把你的物体视为离散的“爆发”。 让我们在1d中有一个例子:汽车从x = 0开始,并且向前加速2个单位/秒^ 2。 您不会重新计算每帧的速度和位置。相反,你会使用一些简单的微积分:速度是加速度的积分,而位置是加速度的积分。因此v = 2*t和p = t^2。你所要做的就是用t代替自初始条件以来已经过了多少时间。

现在假设你在第100个位置有第二个物体,加速到-3个单位/秒^ 2。然后它的速度为-3*t,其位置为100 - (3/2)*t^2。解决当2个位置彼此相等时,我们可以看到它们在t = 40时发生碰撞。

然后,使用方程式,您可以看到事物是否在帧之间发生碰撞。有几个框架甚至会为你做这件事,但重要的是要对它的工作原理有一个基本的了解。

答案 2 :(得分:3)

这是一个侧面问题,但您可能会发现将逻辑更新速率与游戏的帧速率解耦并为物理和逻辑设置固定的时间步骤是值得的。它使很多物理和碰撞事物变得更加简单,并且当帧速率下降时阻止事物爆炸。

Glenn Fiedler's site有一个以这种方式工作的游戏循环的例子。就个人而言,我总是选择固定费率更新。它只是简化了很多事情,特别是在物理学方面。