在iPhone上进行2D碰撞检测的最佳方法是什么?

时间:2010-04-19 07:57:29

标签: iphone 2d quartz-graphics collision-detection

正在研究碰撞检测问题,我可以采取三种主要方法:

  1. 精灵和面具方法。 (和精灵的重叠并检查生成的精灵像素数据中的非零数字)。

  2. 包围圆圈,矩形或多边形。 (创建一个或多个包围精灵的形状,并执行基本数学检查重叠)。

  3. 使用现有的精灵库。

  4. 第一种方法,即使它是我过去在16x16精灵块中完成它的方式,但似乎没有一种简单的方法来获取单个图像像素数据和/或者Quartz中的alpha通道(或OPENGL)。检测边界框的重叠很容易,但是然后从重叠创建第三个图像然后测试像素是很复杂的,我的直觉是,即使我们能够使它工作也会很慢。我错过了一些整洁的东西吗?

    第二种方法是将我们的精灵分成几个多边形并测试它们的重叠。多边形越多,碰撞检测越准确。好处是它速度快,而且准确。缺点是它使精灵创建更复杂。也就是说,我们必须为每个精灵创建多边形。对于速度,最好的方法是创建一个多边形树。

    第三种方法我不确定,因为它涉及购买代码(或使用开源许可证)。我不确定最好使用的库是什么,或者这是否会让生活更轻松,或者让我们在将它集成到我们的应用程序时遇到问题。

    所以简而言之,我赞成使用多边形和树方法,并且在我去编写大量代码之前,请您对此有所了解。

    祝你好运

    戴夫

1 个答案:

答案 0 :(得分:5)

考虑对您的精灵进行多边形化。在“背景”中保留精灵的多边形表示,并使用游戏世界的多边形版本进行碰撞测试。这会产生一些开销和额外的复杂性,但在额外的可能性方面通常是非常有益的。 (动态阴影,灯光效果,独立于精灵图形的碰撞检测,更多碰撞检测方法,多边形交叉等)。

否则你会陷入你所描述的基于像素的方法,这也不错。 (ORing重叠)您可以自己动手或让OpenGL在帧缓冲区中执行。 (我不记得这些电话,认为它被称为z-masking(?),...抱歉。 对于小精灵,这可能会更慢......)考虑使用二进制空间分区技术来优化其中的一些:

例如,四树,允许您快速找到候选精灵进行碰撞测试。它们适用于基于像素和顶点的方法。 或者只使用BSPTrees。

Btw:我认为碰撞检测中的像素精度实际上是一个不错的功能,我在Jump'n Runs中经常使用它。但是,也许不适用于你的游戏。