XNA碰撞检测与游戏速度

时间:2012-07-21 13:06:40

标签: c# xna collision-detection xna-4.0

我已经在C#中编写了几年的代码,现在决定尝试使用XNA框架来制作游戏。

直到我开始在我非常简单的游戏中实现碰撞处理,它才变得很棒。

我可以理解如何使用BoundingBoxes和BoundingSpheres进行碰撞检测,但在查看游戏中的刷新率之后,如果两个碰撞对象从未被检测到碰撞,它很快成为我的关注点。

让我试着用一个例子来解释: - 如果角色用另一个角色的枪射击。 - 子弹直接前往另一个角色。 - 子弹在角色之前渲染。 - 由于子弹高速,它现在会在角色的另一侧渲染。

在这种情况下,子弹和角色永远不会发生碰撞,因为它们永远不会以碰撞状态渲染。

那么如何确保在这种情况下检测到碰撞?

2 个答案:

答案 0 :(得分:1)

对于非常快速移动的对象,常规方法在您描述的场景中失败。您需要检查的是子弹是否与两个连续游戏刻度之间的间隔中的任何项目发生碰撞。这称为continuous collision detection (this is a rather related SO post)

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

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

如果必须提供额外的精度,免费的3D物理库(例如Bullet)可以代表解决方案。它甚至有bindings for XNA

答案 1 :(得分:1)

我认为你的问题在于隧道符合您的描述。

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

在第4页持续碰撞上签入this manual并检查Box2D如何处理隧道效应。