代码之家  ›  专栏  ›  技术社区  ›  Abhishek Mishra

检测精灵之间碰撞的最佳方法?

  •  3
  • Abhishek Mishra  · 技术社区  · 16 年前

    在二维游戏精灵中检测碰撞的最佳方法是什么?我目前在Allegro和G工作++

    7 回复  |  直到 16 年前
        1
  •  3
  •   cs_student    16 年前

    有很多方法可以检测碰撞检测。如果您使用的是二维或三维环境,则所使用的方法将略有更改。还请记住,在建立碰撞检测系统时,要考虑到您可能希望在游戏中实现的任何物理(大多数下降3D游戏都需要),以增强其真实性。

    简短的版本是使用边界框。或者换句话说,将世界上的每个实体都设置为一个框,然后检查框的每个轴是否与其他实体发生碰撞。

    对于要测试冲突的大量实体,您可能希望签入八叉树。您只需将世界划分为扇区,然后只检查相同扇区中对象之间的冲突。

    有关更多资源,您可以转到sourceforge并搜索一个开源碰撞检测和物理引擎的bullet dynamics引擎,或者您也可以查看 http://www.gamedev.net 在丰富的游戏开发主题上拥有丰富的资源。

        2
  •  4
  •   Sparr    16 年前

    任何像样的二维图形库要么为从对齐的精灵到多边形到像素的所有内容提供自己的碰撞检测功能,要么有一个或多个良好的第三方库来执行这些功能。您对引擎/库/框架的选择应该决定您的碰撞检测选择,因为它们可能比您自己能够生成的更优化。

    对阿莱格罗来说 Collegro . 对于SDL来说 SDL_Collide.h SDL-Collide . 你可以使用 I_COLLIDE 使用OpenGL。DarkBasic有内置的碰撞系统,以及 DarkPhysics 对于非常精确的交互,包括碰撞。

        3
  •  2
  •   Niall    16 年前

    我建议你用图书馆 Box2D

        4
  •  1
  •   Mark    16 年前

    这个问题相当普遍。在二维游戏中有很多方法可以进行碰撞检测。知道你想做什么会有帮助。

    不过,作为一个起点,有一些非常简单的方法可以在圆、矩形等之间进行检测。我不是gamedev.net的超级粉丝,但是对于这种检测,这里有一些很好的资源。一篇这样的文章是 here . 它涵盖了一些可能有助于您入门的基本材料。

    基本的二维游戏可以使用矩形或圆形来“包围”屏幕上的对象。检测矩形何时重叠或圆何时重叠是相当直接的数学。如果你需要一些更复杂的东西(比如凸面艺术多边形),那么解决方案就更复杂了。同样,gamedev.net在这里可能会有所帮助。

    但真的要回答你的问题,我们需要知道你想做什么?什么类型的游戏?你想碰撞什么类型的物体?您是否试图与屏幕边界等发生冲突?

        5
  •  1
  •   Brian    15 年前

    碰撞检测系统的实现是一个复杂的问题,但你要考虑三点。

    • 对象世界。空间划分。 如果你对你的世界中的每一个2d精灵进行碰撞检查,你将会有一个缓慢的程序!你需要优先考虑。你需要划分空间。你可以使用一个正交的网格系统,把你的世界分割成一个二维的网格。或者可以使用BSP树,使用行作为分隔符函数。

    • 宽相位碰撞检测 这将使用边界体积(如圆柱体或椭圆(以最接近精灵形状的为准)来确定对象是否值得进行更详细的比较。计算起来很容易。学习二维矩阵变换。对于二维交叉点,您甚至可以使用高功率视频卡来完成很多工作!

    • 窄相位碰撞检测 既然您已经确定了两个或多个对象值得比较,那么就进入到您的微调部分。这个阶段的目标是确定碰撞结果。穿透深度、包围体积等…这些信息将被输入到你计划的任何物理引擎中。在3D中,这是GJK距离算法和其他Neato算法的领域,我们都非常喜欢它们!

    您可以通用地实现所有这些,并以多态方式指定宽分辨率和窄分辨率,或者在使用较低级别的语言时提供挂钩。

        6
  •  0
  •   Thomas    16 年前

    什么之间的碰撞?这取决于你是否使用精灵,凹多边形,凸多边形,矩形,正方形,圆,点…

        7
  •  0
  •   Erik Engheim    15 年前

    在二维中检查两个球之间的碰撞很容易。你可以用谷歌搜索它,但基本上你可以检查两个球的半径组合的长度是否大于或等于两个球的中心之间的距离。

    然后你可以用圆球中心之间的单位向量,乘以圆球半径,找到碰撞点。