检测 2D 游戏精灵中的碰撞的最佳方法是什么?我目前从事 allegro 和 G++ 工作

有帮助吗?

解决方案

有多种方法可以检测碰撞检测。根据您使用的是 2d 还是 3d 环境,您使用的方法将略有不同。还要记住,在建立碰撞检测系统时,要考虑到您可能想要在游戏中实现的任何物理原理(大多数下降 3D 游戏需要),以增强其真实性。

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

对于需要测试碰撞的大量实体,您可能需要签入八叉树。您可以简单地将世界划分为多个扇区,然后仅检查同一扇区中的对象之间的碰撞。

如需更多资源,您可以访问 sourceforge 并搜索 Bullet 动力学引擎,这是一个开源碰撞检测和物理引擎,或者您可以查看 http://www.gamedev.net 其中有大量关于丰富的游戏开发主题的资源。

其他提示

任何像样的 2D 图形库要么为从对齐精灵到多边形再到像素的所有内容提供自己的碰撞检测功能,要么拥有一个或多个良好的第三方库来执行这些功能。您对引擎/库/框架的选择应该决定您的碰撞检测选择,因为它们可能比您单独生产的要优化得多。

对于 Allegro 有 科莱格罗. 。对于 SDL 有 SDL_Collide.h 或者 SDL-碰撞. 。您可以使用 我_碰撞 与OpenGL。DarkBASIC有一个内置的碰撞系统,并且 黑暗物理 用于非常准确的交互,包括碰撞。

我推荐使用图书馆 盒子2D

这个问题很笼统。在 2d 游戏中进行碰撞检测的方法有很多。了解您想做什么会有所帮助。

不过,作为起点,有一些非常简单的方法可以在圆形、矩形等之间进行检测。我不是 gamedev.net 的忠实粉丝,但那里有一些关于此类检测的好资源。一篇这样的文章是 这里. 。它涵盖了一些可能帮助您入门的基本材料。

基本的 2d 游戏可以使用矩形或圆形来“包围”屏幕上的对象。检测矩形何时重叠或圆形何时重叠是相当简单的数学运算。如果您需要更复杂的东西(例如凸分支多边形),那么解决方案就会更复杂。同样,gamedev.net 可能会提供一些帮助。

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

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

  • 物体的世界。空间划分。如果您对世界中的每个 2d 精灵与其他所有物体进行碰撞检查,您将得到一个缓慢的程序!你需要优先考虑。您需要对空间进行分区。您可以使用正交网格系统并将您的世界分割成二维网格。或者您可以使用 BSP 树,使用行作为分隔符函数。

  • 广泛的相碰撞检测该使用边界量,例如圆柱或电子(以近似于您的精灵形状的形状最好)来确定对象是否值得更详细地进行比较。数学很简单。了解二维矩阵变换。对于 2d 交叉,您甚至可以使用高功率显卡来完成大量工作!

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

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

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

在 2D 中检查两个球之间的碰撞很容易。你可以用谷歌搜索它,但基本上你会检查两个球半径组合的长度是否大于或等于两个球中心之间的距离。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top