2011-12-02 1 views
2

J'ai un tableau de CCSprites qui sont affichés tous en même temps. Chaque sprite a un chemin de mouvement, un chemin de mouvement est un point aléatoire sur l'écran.cocos2d sprite collision

Tous les sprites se déplacent tous en même temps vers des points aléatoires sur l'écran. Ce que je veux faire est de détecter la collision entre les sprites et puis changer leur chemin de mouvement.

Est-ce possible?

+0

duplication possible de [comment utiliser collision de sprite cocos2d?] (Http://stackoverflow.com/questions/1338569/how-to-use-cocos2d-sprite-collision) – sergio

Répondre

3

Itérer à travers tous les CCSprite dans votre tableau (appeler A), et pour chaque itération itérer à nouveau par chaque CCSprite dans le tableau (hors A lui-même bien sûr) (appeler celui-ci B). Maintenant, utilisez CGRectIntersectsRect avec boundingBox pour trouver une collision entre eux. Il va quelque chose comme ceci:

 for (CCSprite *first in mySprites) { 
      for (CCSprite *second in mySprites) { 
       if (first != second) { 
        if (CGRectIntersectsRect([first boundingBox], [second boundingBox])) { 
         // COLLISION! Do something here. 
        } 
       } 
      } 
     } 

Modifier: Mais bien sûr, il est possible que si deux sprites entrent en collision, « l'événement de collision » se produira deux fois (d'abord du point de vue de Sprite, et puis du point de vue du sprite B).

Si vous souhaitez uniquement que l'événement de collision se déclenche une fois par contrôle, vous devez mémoriser les paires afin de pouvoir ignorer les collisions qui ont déjà eu lieu lors de ce contrôle.

Il y a d'innombrables façons, vous pouvez vérifier pour cela, mais voici un exemple (code mis à jour):

Edité à nouveau:

NSMutableArray *pairs = [[NSMutableArray alloc]init]; 
    bool collision; 
    for (CCSprite *first in mySprites) { 
     for (CCSprite *second in mySprites) { 
      if (first != second) { 
       if (CGRectIntersectsRect([first boundingBox], [second boundingBox])) { 
        collision = NO; 
        // A collision has been found. 
        if ([pairs count] == 0) { 
         collision = YES; 
        }else{ 
         for (NSArray *pair in pairs) { 
          if ([pair containsObject:first] && [pair containsObject:second]) { 
           // There is already a pair with those two objects! Ignore collision... 
          }else{ 
           // There are no pairs with those two objects! Add to pairs... 
           [pairs addObject:[NSArray arrayWithObjects:first,second,nil]]; 
           collision = YES; 
          } 
         } 
        } 
        if (collision) { 
         // PUT HERE YOUR COLLISION CODE. 
        } 
       } 
      } 
     } 
    } 
    [pairs release]; 
+2

Remarque: cela ne fonctionne que si aucun des les sprites sont tournés. Sinon, boundingBox peut être significativement plus grand que l'image rect. – LearnCocos2D

+1

J'ai une autre question: si les deux sprites se croisent, le code dans le 'bloc de collision' est appelé plusieurs fois, comment puis-je l'appeler une seule fois pour la paire de collision actuelle? –

+0

Mis à jour avec le nouveau code. Cela devrait aider. – Voldemort

1

Jetez un oeil à ce S.O. answers.

Vous pouvez effectuer une détection de collision simple à l'aide de CGRectIntersectsRect et du noeud boundingBox. Si vous avez besoin de fonctionnalités plus avancées, jetez un oeil à un moteur de physique comme chipmunk ou Box2D.

0

Ray Wenderlich a écrit un bon tutoriel sur l'utilisation Box2D juste pour la détection de collision, si vous êtes intéressé à aller de cette façon. http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

Vérifiez d'abord que vos sprites peuvent être approximés par des rectangles. Si oui, la réponse de @ Omega était géniale. S'ils ne peuvent pas l'être, peut-être parce qu'ils contiennent beaucoup de transparence ou pour une autre raison, vous devrez peut-être approcher vos sprites avec des polys et travailler avec ceux-ci.