XNA 2D碰撞检测

时间:2012-03-29 01:41:38

标签: c# xna collision-detection physics

我想知道在哪里可以找到一些很好的资源材料,我可以编写一些干净的碰撞检测编码。

我对XNA编程很陌生,并对我如何编写游戏有一个大致的了解,但我对碰撞检测的想法有严重的麻烦。这让我很难过。

我知道你可以使用2d boundingbox类。但在那之后,我被困住了。我不想检查一个物体是否与游戏中的每一个物体发生碰撞,所以我想知道是否有人可以指出我正确的方向找到关于这个问题的一些文献。

2 个答案:

答案 0 :(得分:0)

如果您只是想尽量减少CPU检测工作,请查看QuadTree实现。它们基本上将你的“场景”分解成更小的部分以优化检测(例如在C#中): http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C

如果您正在谈论更多关于实际物理的知识,请查看N-Game开发人员的教程: http://www.metanetsoftware.com/technique.html

或者只使用现有的XNA物理引擎,例如Farseer或Bullet。

答案 1 :(得分:0)

这在很大程度上取决于游戏的规模和实施。对象是如何组织的?游戏是否按照地图组织,或者只有一个屏幕?哪些对象会与其他对象发生碰撞?

如果游戏规模足够小,你可能根本不需要担心它。

如果没有,请考虑:

  • 将游戏拆分为不同的地图,其中一个地图上的对象只会与同一地图上的其他对象发生碰撞

  • 按类型组织敌人列表,这样您就可以只检查正确类型的对象。 (即:射弹没有检查射弹等......)。例如,我使用以下词典,以便我只能检查某种类型的对象,或只检查属于某个派系的生物:

    private readonly Dictionary<Type, List<MapObject>> mTypeObjects = 
    new Dictionary<Type, List<MapObject>>();
    
    private readonly Dictionary<FACTION, List<MapObject>> mFactionCreatures =
    new Dictionary<FACTION, List<MapObject>>();
    
  • 为了实现最高效率,但是更具挑战性的实现,您可以使用空间分区,其中对象按“扇区”进行组织,允许您立即排除远处的对象。