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