3

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

在我开始在我非常简单的游戏中实现碰撞处理之前,它一直很棒。

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

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

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

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

4

2 回答 2

1

对于非常快速移动的对象,常规方法在您描述的场景中失败。您需要检查的是子弹是否在两个连续游戏滴答之间的间隔内与任何项目发生碰撞。这称为连续碰撞检测(这是一个相当相关的 SO 帖子)

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

为了更精确,您可以从当前弹框的每个角投射四个不同的所谓碰撞射线,到它们与前一个游戏时间对应的位置。请注意,在极少数情况下比子弹还小的高速物品,这也可能会失败。在这种情况下,您将需要更高级的碰撞检测系统。但这只是一个极端情况。

如果需要额外的精度,那么免费的 3D 物理库(例如Bullet )可以代表一种解决方案。它甚至有XNA 的绑定

于 2012-07-21T13:16:33.410 回答
1

我认为您的问题在于与您的描述相匹配的隧道。

我推荐你为 XNA 使用 Box2D 物理引擎。它快速、简单,可以避免您在游戏中遇到任何碰撞问题。

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

于 2012-07-21T13:27:43.200 回答