XNA碰撞检测与游戏速度

3

我已经用C#编程数年了,现在决定尝试使用XNA框架制作游戏。

一切顺利,直到我开始在我的简单游戏中实现碰撞处理。

我能够理解如何使用BoundingBoxes和BoundingSpheres进行碰撞检测,但是在查看游戏的刷新率后,我开始担心两个碰撞对象是否会被漏掉。

让我举个例子来解释一下: - 如果一个角色用枪向另一个角色射击。 - 子弹直飞另一个角色。 - 子弹在角色之前呈现。 - 由于子弹的高速运动,它现在在角色的另一侧呈现。

在这种情况下,子弹和角色永远不会发生碰撞,因为它们从未以它们相互碰撞的状态呈现。

那么,在这种情况下怎样确保检测到碰撞?

2个回答

1

对于非常快速移动的物体,常规方法在您描述的情况下会失败。您需要检查的是子弹是否与两个连续游戏刻度之间的任何物品发生了碰撞。这被称为连续碰撞检测(这是一个相关的SO帖子)

您可以通过基本上在当前位置的子弹绑定框的中心和旧位置的框的中心之间投射一条射线,并检查是否与其他块/球体发生碰撞来实现这一点。这是一个相当快速的解决方案,如果您的子弹足够小,它应该可以正常工作。

为了更精确,您可以从当前子弹框的每个角落到其前一个游戏刻度的相应位置投射四个不同的所谓碰撞射线。请注意,在高速物品小于子弹的罕见情况下,这也可能失败。在这种情况下,您将需要更先进的碰撞检测系统。但这只是一个特例。

如果需要更高的精度,可以使用免费的3D物理库,例如Bullet,这可能是一个解决方案。它甚至有XNA绑定

还要注意的是,每当您使碰撞检测更加复杂时,性能问题就会开始出现。我的做法是创建一个线程池,并传递所有可碰撞对象的帧,每个可碰撞对象都有一个碰撞事件。线程池允许在所有可用线程上进行碰撞检测。 - user1146887

1

我认为你的问题在于隧道效应,这与你的描述相符。

我建议你使用XNA的Box2D物理引擎。它快速、简单,并且可以避免游戏中的任何碰撞问题。

请查看本手册第4页上的连续碰撞,并查看Box2D如何处理隧道效应。


+1 很好的答案,但由于需要第三方库,我更喜欢另一个答案。 - reSPAWNed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接