【问题标题】:What is the best approach to 2D collision detection on the iPhone?在 iPhone 上进行 2D 碰撞检测的最佳方法是什么?
【发布时间】:2023-03-21 05:22:01
【问题描述】:

一直在研究这个碰撞检测问题,我似乎可以采取 3 种主要方法:

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

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

  3. 使用现有的精灵库。

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

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

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

所以简而言之,我更喜欢多边形和树的方法,在我开始编写大量代码之前,我会感谢您对此的看法。

最好的问候

戴夫

【问题讨论】:

  • 除非您的游戏中有一个气球试图在仙人掌森林中导航,否则像素完美碰撞几乎永远不是正确的方法。人们不想死,因为他们鼻子的 1 个像素与忍者脚的 1 个像素相交。
  • 使用(一组)边界框/圆很快,而且通常是要走的路。尽量不要为精灵的每个动画帧更改框/圆圈。这会产生奇怪的效果(例如,你走到墙上,转身,突然你的脚卡在墙上)
  • 您是如何得知我们的气球仙人掌游戏的 :o)。不过有用的建议,你是多边形还是图书馆?附:如果您想添加您的 cmets 作为答案,我可以投票/接受。

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


【解决方案1】:

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

否则,您将无法使用您描述的基于像素的方法,这也不错。 (或重叠)你可以自己做,也可以让 OpenGL 在帧缓冲区中做。 (我不记得电话了,我想它叫 z-masking(?),......对不起。 对于小精灵,这甚至可能更慢...)考虑使用二进制空间分区技术来优化其中的一些:

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

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

【讨论】:

  • 谢谢安德烈亚斯,真的很有用。该游戏是一种模拟,主要是一个精灵(最多 3 个)相互碰撞或更复杂的背景层。所以听起来像圈子和树是要走的路。你有图书馆的经验吗?
  • Gamedev.net 有很好的例子。我认为还有一个可复制和可粘贴的四叉树 impl。那里。我知道没有图书馆。如果你找到了,在这里提一下会很酷。我可以将它用于我的机器人项目。
  • 干杯,会做的。再次感谢大家的指点,真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多