【问题标题】:XNA collission detection vs. game speedXNA 碰撞检测与游戏速度
【发布时间】:2012-07-21 21:27:43
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果需要额外的精度,免费的 3D 物理库,例如 Bullet 可以代表一个解决方案。它甚至还有bindings for XNA

    【讨论】:

    • 另请注意,每次您使碰撞检测更加复杂时,性能问题就会开始出现。我所做的是创建一个 ThreadPool 并传递所有可碰撞对象的帧,每个可碰撞对象都有一个碰撞事件。 ThreadPool 允许在所有可用线程上进行冲突检测。
    【解决方案2】:

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

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

    在第 4 页签入this manual连续碰撞,查看 Box2D 如何处理隧道效应。

    【讨论】:

    • +1 不错的答案,但由于这需要第三方库,我更喜欢其他答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多