在 2d 游戏精灵中检测碰撞的最佳方法是什么?我目前在 allegro 和 G++ 工作
7 回答
任何体面的 2D 图形库要么为从对齐的精灵到多边形到像素的所有内容提供自己的碰撞检测功能,要么拥有一个或多个优秀的第三方库来执行这些功能。您对引擎/库/框架的选择应该决定您的碰撞检测选择,因为它们可能比您单独生产的优化得多。
对于 Allegro 有Collegro。对于 SDL,有SDL_Collide.h或SDL-Collide。您可以将I_COLLIDE与 OpenGL 一起使用。DarkBASIC 有一个内置的碰撞系统和DarkPhysics,用于非常精确的交互,包括碰撞。
有很多方法可以检测碰撞检测。如果取决于您使用的是 2d 还是 3d 环境,您使用的方法将略有改变。还要记住,在建立碰撞检测系统时,要考虑到您可能想要在游戏中实现的任何物理特性(大多数下降 3d 游戏都需要),以增强它的真实性。
简短的版本是使用边界框。或者换句话说,将世界上的每个实体都做成一个盒子,然后检查盒子的每个轴是否与其他实体发生碰撞。
使用大量实体来测试冲突,您可能需要检查八叉树。您可以简单地将世界划分为多个扇区,然后仅检查同一扇区中的对象之间的碰撞。
更多资源,你可以去 sourceforge 搜索 Bullet 动态引擎,它是一个开源的碰撞检测和物理引擎,或者你可以查看http://www.gamedev.net,它有大量的游戏开发资源话题。
使用库,我推荐Box2D
这个问题很笼统。在 2d 游戏中进行碰撞检测有很多方法。这将有助于了解您正在尝试做什么。
不过,作为一个起点,有一些非常简单的方法可以在圆形、矩形等之间进行检测。我不是 gamedev.net 的忠实粉丝,但是那里有一些关于这种检测的好资源。一篇这样的文章在这里。它涵盖了一些可能有助于您入门的基本材料。
基本的 2d 游戏可以使用矩形或圆形来“包围”屏幕上的对象。检测矩形何时重叠或圆形何时重叠是相当简单的数学运算。如果您需要更复杂的东西(例如凸任意多边形),那么解决方案会更复杂。同样,gamedev.net 在这里可能会有所帮助。
但要真正回答您的问题,我们需要知道您要做什么?什么类型的游戏?你想碰撞什么类型的物体?您是否试图与屏幕边界等发生冲突?
在 2D 中检查两个球之间的碰撞很容易。你可以用谷歌搜索,但基本上你检查两个球半径的长度是否大于或等于两个球中心之间的距离。
然后,您可以通过获取球中心之间的单位向量并将其与球半径之一相乘来找到碰撞点。
碰撞检测系统的实现是一件复杂的事情,但是您要考虑三点。
物体的世界。空间分区。如果您对世界中的每个 2d 精灵与其他所有东西进行碰撞检查,那么您的程序会很慢!你需要优先考虑。您需要对空间进行分区。您可以使用正交网格系统并将您的世界分割成二维网格。或者您可以使用 BSP 树,使用行作为分隔符函数。
广泛的相位碰撞检测这使用圆柱体或椭圆等边界体积(以最接近您的精灵的形状)来确定对象是否值得进行更详细的比较。数学很容易。学习你的二维矩阵变换。而对于 2d 路口,您甚至可以使用高功率显卡来完成大量工作!
窄相碰撞检测 既然您已经确定两个或多个对象值得比较,您就可以进入微调部分。此阶段的目标是确定碰撞结果。穿透深度、包含的体积等……这些信息将被输入到您计划的任何物理引擎中。在 3d 中,这是 GJK 距离算法和我们都非常喜欢的其他整洁算法的领域!
您可以通用地实现所有这些并以多态方式指定广义和狭义分辨率,或者如果您使用较低级别的语言工作,则可以提供一个挂钩。
之间有什么碰撞?这取决于您是否使用精灵、凹多边形、凸多边形、矩形、正方形、圆形、点...