Comment détecter une collision entre 2 UIViews

J'ai un UIImageView qui contient mon personnage principal, et j'ai fait apparaître le cercle UIImageView voir ci-dessous le code pour créer mon personnage

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]; 

J'ai des problèmes avec ma collision entre mon personnage et d'autres objects dans le jeu. La collision est détectée sur le rectangle plutôt que sur le cercle. J'ai cherché partout une réponse pour résoudre ce problème mais pas de chance.

Voici mon code de collision que j'utilise:

  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]; 

Donc, fondamentalement, j'ai besoin que les limites du cercle du personnage entrent en collision avec un object rectangle, pas les limites du rectangle dans lequel se trouve le cercle. J'espère que cela a du sens.

Merci d'avance

Droit, donc d'abord vous vérifiez les rectangles qui se chevauchent (que vous avez déjà fait). Lorsque vous trouvez un chevauchement, vous devez affiner le test de collision. Pour chaque coin du rectangle offensant, calculez la distance entre le centre de votre personnage et le coin du rectangle offensant. Si la distance entre le centre et l'un des coins est inférieure au rayon du cercle, vous avez une collision. Pour optimiser un peu le code, calculez (dx * dx + dy * dy) et comparez cela au carré du rayon. De cette façon, vous n'avez pas besoin de calculer des racines carrées.

Après un examen plus approfondi, vous devez également effectuer une vérification des contours en plus de la vérification des coins. Par exemple, si la valeur y supérieure est au-dessus du centre du cercle et la valeur inférieure y est inférieure au centre du cercle, calculez la différence entre x entre le bord gauche du rectangle et le centre du cercle, et si cette distance est inférieur au rayon, une collision est survenue. De même pour les trois autres bords du rectangle.

Voici un pseudo-code pour la vérification de coin

 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!!! } } 

J'utiliserais un CGPathRef ou un CGMutablePathRef. Donc, comme le suggère @ user3386109, vérifiez d'abord la collision entre les arguments, puis si vous avez un pathRef pour votre sprite ou quoi que ce soit, vous pouvez utiliser CGPathContainsPoint (). Quartz a aussi quelques autres fonctions de comparaison pour CGPathRef pour les Rects, et pour comparer un path avec un second path, vérifiez les docs. Je trouve que CGPathRef est assez efficace, mais n'oubliez pas de le libérer avec un CGPathRelease () pour correspondre à chaque fonction CGPathCreate ou CGPathCopy () ou les fuites peuvent s'accumuler très rapidement.