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