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