iOS - 如何检测两个或多个对象是否发生碰撞

时间:2012-02-06 11:33:17

标签: objective-c ios core-graphics collision

如何检测两个或多个物体是否发生碰撞? 我想只使用默认框架,例如Core Graphics。或者我必须使用Box2d或Cocos2d?

EDIT 你是对的,问题不是很清楚。 所以情况就是这样: 我有多个UIImageView随加速度计一起移动,但我希望当两个或多个图像碰撞时,它们彼此不重叠。它清楚了吗?

2 个答案:

答案 0 :(得分:1)

可能你想要一个多步骤的过程。

首先,为每个对象定义“中心”和“半径”,使得在所选半径的中心周围绘制的线将完全包含对象,而不会“太多额外”。 (您可以定义如何努力定义中心和半径以防止“太多”。)

可选的下一步是以某种方式将屏幕划分为象限/部分,并计算哪些对象(基于它们的中心和半径)完全位于一个象限内,该象限跨越象限边界,跨越4个象限,等等。允许您对下一步进行子集化,并且只考虑位于同一象限中的对象对,或者两者中的一个是一种或另一种跨越器的对象。

然后,在每对物体之间,使用毕达哥拉斯定理计算中心距。如果该距离小于两个物体半径的总和,则可能发生碰撞。

最后,你必须在计算实际碰撞时沮丧。根据对象的形状,有几种不同的方法。显然,前一步骤覆盖了圆圈,可以很好地计算正方形/矩形(与X / Y轴对齐),但奇怪的形状更难。一种方案是,在一对“空白”画布上,绘制两个对象,然后将两个像素逐个对齐,看看你是否在任何地方想出1。这种方案有几种变体。

答案 1 :(得分:0)

如上所述,您的问题非常模糊,因此难以简洁地回答。但是为了给你一些想法,你可以用核心动画做到这一点,虽然一些第三方游戏引擎/框架可能更有效。

基本上,你创建了一个经常触发的计时器(通常取决于你碰撞的对象的大小和它们的速度 - 太慢而且在计时器触发之前对象可以碰撞并相互传递 - 数学是你的朋友在这里)。

每次计时器启动时,都会检查屏幕上的每个对象是否与其他对象发生冲突。为了提高效率,您应该确保只检查每对一次 - 即。如果您有A,B,C,D物体,请检查A& D但不是D& A.

如果你有碰撞处理它你想要(动画/点/通知/你想做什么)。

在帖子中有太多内容可以覆盖。我建议在cocoawithlove上查看关于小行星游戏的优秀文章,特别是第3部分(虽然不是iOS的原则是相同的): http://cocoawithlove.com/2009/03/asteroids-style-game-in-coreanimation.html