如何检测2个UIViews之间的碰撞

我有一个UIImageView包含我的主要字符,我已经使UIImageView出现圆圈见下面的代码创build我的性格

copter = [[UIImageView alloc] initWithFrame:CGRectMake(100, 500, 90, 90)]; [copter setContentMode:UIViewContentModeScaleAspectFit]; copter.layer.cornerRadius = roundf(copter.frame.size.width/2.0); copter.layer.masksToBounds = YES; [copter startAnimating]; [[self view] addSubview:copter]; [self setBat:copter]; 

我在我的angular色和游戏中的其他物体之间发生碰撞时遇到了麻烦。 在矩形而不是圆上检测到碰撞。 我到处寻找答案来解决这个问题,但没有运气。

这是我使用的碰撞代码:

  self.batVelocity += [link duration]*FBDownardBatAccelerationIpad; [[self copter] setFrame:CGRectOffset([[self copter] frame], 0, [self batVelocity])]; UIView *removeBlock = nil; for (UIView *block in [self blocks]) { [block setFrame:CGRectOffset([block frame], [link duration]*FBSidewaysVelocityIpad, 0)]; if (CGRectIntersectsRect([[self copter] frame], [block frame])) { [self failed]; 

所以基本上我需要angular色的边界与一个矩形对象碰撞,而不是圆形所在的矩形边界。我希望这是有道理的。

提前致谢

对,所以首先检查重叠的矩形(你已经完成了)。 当你发现重叠,那么你需要改进碰撞testing。 对于有问题的矩形的每个angular落,计算从angular色的中心到有问题的矩形的angular的距离。 如果从中心到任何一个angular的距离小于圆的半径,则发生碰撞。 为了优化代码,计算(dx * dx + dy * dy)并将其与半径平方进行比较。 这样你就不必计算任何平方根。

经过进一步审查,除angular落检查外,还需要进行边检。 例如,如果顶部的y值高于圆的中心,底部的y值低于圆的中心,则计算矩形左边与圆的中心之间的x差,如果该距离小于半径,则发生碰撞。 对于矩形的其他三个边缘也是如此。

这里有一些用于angular落检查的伪代码

 int dx, dy, radius, radiusSquared; radiusSquared = radius * radius; for ( each rectangle that overlaps the player rectangle ) { for ( each corner of the rectangle ) { dx = corner.x - center.x; dy = corner.y - center.y; if ( dx * dx + dy * dy < radiusSquared ) Collision!!! } } 

我会使用CGPathRef或CGMutablePathRef。 所以@ user3386109build议,首先检查rects之间的冲突,然后如果你有一个适合你的精灵的path引用,或者你可以使用CGPathContainsPoint()。 Quartz还有一些CGPathRef for Rects的其他比较函数,为了比较一个path和另一个path,请检查文档。 我发现CGPathRef是相当有效的,但不要忘记释放它与CGPathRelease()匹配每个CGPathCreate或CGPathCopy()函数或泄漏可以加起来真正快速..