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

3

如何在2D游戏精灵中检测碰撞是最好的方式?我目前正在使用Allegro和G++进行开发。


这个问题现在是关于精灵的。 - Chris Charabaruk
7个回答

4
任何一个不错的2D图形库都会提供自己的碰撞检测函数,从对齐精灵到多边形到像素,或者有一个或多个好的第三方库来执行这些功能。你选择的引擎/库/框架应该决定你的碰撞检测选择,因为它们可能比你单独开发的要优化得多。
对于 Allegro,有Collegro。对于 SDL,有SDL_Collide.hSDL-Collide。你可以在 OpenGL 中使用I_COLLIDE。DarkBASIC有一个内置的碰撞系统,以及DarkPhysics,用于非常精确的交互,包括碰撞。

@Abhishek Mishra,你可能想把这个加到你的问题里,也许有其他人知道另一个好的解决方案。 - Huppie
Collegro的网址无法使用,但您可以在此处找到有关它的主题:http://www.allegro.cc/forums/thread/550371此外,PPCol也可用于Allegro。 - Stefan Hendriks

4

有许多方法可以检测碰撞。如果您使用的是2D或3D环境,则使用的方法会略有不同。同时,在引入碰撞检测系统时,请考虑您可能想在游戏中实现的任何物理效果(大多数高质量3D游戏都需要),以增强其真实感。

简短的版本是使用边界框。换句话说,将世界中的每个实体制作成一个盒子,然后检查盒子的每个轴是否与其他实体发生碰撞。

对于要测试碰撞的大量实体,您可能需要考虑八叉树。您只需将世界分成几个区块,然后仅在相同区块内的对象之间检查碰撞即可。

如需更多资源,您可以前往sourceforge并搜索Bullet动力学引擎,这是一个开源的碰撞检测和物理引擎,或者您可以访问http://www.gamedev.net,该网站提供了大量关于游戏开发的资源。


2

使用一个库,我推荐Box2D


1

实现碰撞检测系统是一件复杂的事情,但您需要考虑三个要点。

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

  • 广相碰撞检测 这使用边界体(例如圆柱体或椭圆体,以最好地近似您精灵的形状)来确定是否值得更详细地比较对象。这方面的数学很容易。学习你的 2D 矩阵转换。对于 2D 相交,甚至可以使用高性能视频卡来完成大部分工作!

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

您可以通用地实现所有这些,并以多态方式指定广泛和狭窄的分辨率,或者如果您正在使用较低级别的语言,则提供钩子。


1

这个问题比较普遍。在2D游戏中,有许多方法可以进行碰撞检测。了解您要做什么将会有所帮助。

作为起点,有一些相当简单的方法可以允许检测圆形、矩形等之间的碰撞。我不是gamedev.net的忠实粉丝,但那里有一些关于这种类型检测的好资源。其中一篇文章在这里。它涵盖了一些基本材料,可能会帮助您入门。

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

但是,真正回答您的问题,我们需要知道您要做什么?是什么类型的游戏?您要与哪些对象发生碰撞?您是否试图与屏幕边界发生碰撞等。


我不是gamedev.net的忠实粉丝,通常我自己也不使用他们的教程。然而,该网站的论坛非常活跃,你可以在论坛中搜索好的教程资源(除了gamedev.net之外),以及特定的问题解答。我只是试图引导他朝着正确的方向前进。 - cs_student

1

在二维中检测两个球之间的碰撞很容易。你可以搜索一下,但基本上你需要检查两个球半径的长度之和是否大于或等于两个球中心之间的距离。

然后,你可以通过取两个球中心之间的单位向量并将其乘以其中一个球的半径来找到碰撞点。


0

碰撞之间的是什么?这取决于您使用的精灵、凹多边形、凸多边形、矩形、正方形、圆形、点...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接