iphone - iPhone 上 2D 碰撞检测的最佳方法是什么?

标签 iphone 2d quartz-graphics collision-detection

一直致力于解决碰撞检测问题,我可以采取 3 种主要方法:

  1. Sprite 和蒙版方法。 (以及 Sprite 的重叠并检查生成的 Sprite 像素数据中是否有非零数字)。

  2. 边界圆、矩形或多边形。 (创建一个或多个包围 Sprite 的形状并进行基本数学计算以检查是否重叠)。

  3. 使用现有的 Sprite 库。

第一种方法,尽管这就是我在过去 16x16 Sprite block 的做法,但似乎没有一种简单的方法来获取单个图像像素数据和/或 Quartz 中的 alpha channel (或 OPENGL)。检测边界框的重叠很容易,但是从重叠创建第三个图像,然后测试它的像素就很复杂,而且我的直觉是,即使我们能让它工作也会很慢。我在这里错过了一些简洁的东西吗?

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

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

因此,简而言之,我更喜欢多边形和树方法,并且在我编写大量代码之前,希望您能对此发表看法。

致以诚挚的问候

戴夫

最佳答案

考虑将你的 Sprite 多边形化。在“后台”保留 Sprite 的多边形表示,并使用游戏世界的多边形版本进行碰撞测试。这会产生一些开销和额外的复杂性,但就额外的可能性而言通常是非常有益的。 (动态阴影、光照效果、独立于 Sprite 图形的碰撞检测、更多碰撞检测方法、多边形相交等)

否则您将陷入您所描述的基于像素的方法,这也不错。 (对重叠进行“或”运算)您可以自己执行此操作,也可以让 OpenGL 在帧缓冲区中执行此操作。 (我不记得这些电话,认为它被称为 z 掩蔽(?),......抱歉。 对于小 Sprite ,这甚至可能会更慢...)考虑使用二进制空间分区技术来优化其中的一些技术:

例如,四叉树可以让您快速找到用于碰撞测试的候选 Sprite 。它们适用于基于像素和基于顶点的方法。 或者只使用 BSPTree。

顺便说一句:我认为碰撞检测的像素精度实际上是一个很好的功能,我在 Jump'n Runs 中经常使用它。但可能不适用于您的游戏。

关于iphone - iPhone 上 2D 碰撞检测的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2665952/

相关文章:

objective-c - 如何在 Mac OS X 上将 CALayer 添加到 NSView

macos - 是否可以通过我的应用程序分发图像单元?

ios - UIScrollViews 并在其上添加组件

c - 二维数组、函数、C

c++ - OpenGL 二维旋转

android - 在 Android 上使用透明绘画绘图

macos - 如何删除Cocoa中绘制的对象?

ios - 一个 .h 和 .m 文件用于多个 xib ios

iphone - 使用 NSCache : Not clearing or removing memory how I expect

iphone - 如何创建 WiFi 弹出登录页面