2012-05-07 3 views
0

-je avoir plusieurs sprites placés sur un sprite de fond comme celui-ci:Cocos2d Sprites Collision

//my background 
CCSprite *bg = [CCSprite spriteWithFile:@"imageName.png"]; 

[self addchild:bg]; 

Et puis-je ajouter mes articles sur bg

//this is how i add my items 
CCSprite *items = [CCSprite spriteWithFile:@"itemName.png"]; 

[bg addchild:items]; 

Oh, et sans oublier mon sprite voiture

//my car 
CCSprite *car = [CCSprite spriteWithFile:@"car.png"]; 
[self addchild:car]; 

J'utilise une boucle pour ajouter plusieurs sprites sur le bg.

Maintenant, la question est de savoir comment détecter si la voiture est entrée en collision avec les multiples sprites que j'ai placés sur le bg?

J'ai essayé d'utiliser CGRectIntersectsRect et cela ne fonctionne pas.

J'ai essayé d'utiliser la méthode du théorème de pythagore et encore une fois cela ne fonctionne pas.

Il y avait une méthode qui impliquait l'ajout des sprites d'éléments dans un NSMutableArray et cela ne fonctionnait pas non plus. Est-ce que quelqu'un peut suggérer une méthode par laquelle je peux essayer?

Code additionnel:

-(void) initializeCarAndItems 
{ 
    car = [CCSprite spriteWithFile:@"android.png"]; 
    car.position = ccp(screenSize.width/2, screenSize.height * 0.30); 
    [self addChild:car z:1]; 
    carRect = [car boundingBox]; 
} 

-(void) initializeMap 
{ 
    bg1 = [CCSprite spriteWithFile:@"racingBG.png"]; 
    bg1.anchorPoint = ccp(0, 0); 
    bg1.position = ccp(0, 0); 

    [self addChild:bg1 z:-1]; 

    bg2 = [CCSprite spriteWithFile:@"racingBG2.png"]; 
    bg2.anchorPoint = ccp(0,0); 
    bg2.position = ccp(0, bg1.boundingBox.size.height - 1); 

    [self addChild:bg2 z:-1]; 

    convertedWidth = (int)bg1.boundingBox.size.width; 
    convertedHeight = (int)bg1.boundingBox.size.height; 

    for (y = 0; y < 15; y++) 
    { 
     positionX = arc4random()%convertedWidth; 
     positionY = arc4random()%convertedHeight; 

     items = [CCSprite spriteWithFile:@"item.png"]; 
     items.position = ccp(positionX, positionY + 300); 
     [bg1 addChild:items z:100]; 
     [itemsArray addObject:items]; 
    } 

    for (y = 0; y < 15; y++) 
    { 
     positionX = arc4random()%convertedWidth; 
     positionY = arc4random()%convertedHeight; 

     items = [CCSprite spriteWithFile:@"item.png"]; 
     items.position = ccp(positionX, positionY); 
     [bg2 addChild:items z:100]; 
     [itemsArray addObject:items]; 
    } 
} 

-(void) accelerate 
{ 
    bg1.position = ccp(0, bg1.position.y - accelerateNumber); 
    bg2.position = ccp(0, bg2.position.y - accelerateNumber); 

    if (bg1.position.y < -bg1.boundingBox.size.height) 
    { 
     questionCount++; 
     bg1.position = ccp(0, bg2.position.y + bg2.boundingBox.size.height - 1); 
     [self question]; 

     [bg1 removeAllChildrenWithCleanup:YES]; 
     for (y = 0; y < 15; y++) 
     { 
      positionY = arc4random()%convertedHeight; 
      positionX = arc4random()%convertedWidth; 

      items.position = ccp(positionX, positionY); 
      items = [CCSprite spriteWithFile:@"item.png"]; 
      [bg1 addChild:items z:100]; 
      [itemsArray addObject:items]; 
     } 
    } 
    else if (bg2.position.y < -bg2.boundingBox.size.height) 
    { 
     questionCount++; 
     bg2.position = ccp(0, bg1.position.y + bg1.boundingBox.size.height - 1); 
     [self question]; 

     [bg2 removeAllChildrenWithCleanup:YES]; 
     for (y = 0; y < 15; y++) 
     { 
      positionY = arc4random()%convertedHeight; 
      positionX = arc4random()%convertedWidth; 

      items.position = ccp(positionX, positionY); 
      items = [CCSprite spriteWithFile:@"item.png"]; 
      [bg2 addChild:items z:100]; 
      [itemsArray addObject:items]; 
     } 
    } 
} 

-(void) update:(ccTime)deltaTime 
{ 
    [self ifEdgeOfScreen]; 
    [self accelerate]; 

    for (CCSprite *itemFromArray in itemsArray) 
    { 
     CGRect itemRect = [itemFromArray boundingBox]; 
     if (CGRectIntersectsRect(carRect, itemRect)) 
     { 
      NSLog(@"Collision!"); 
     } 
    } 

    if (leftButton.active == TRUE) 
    { 
     [self moveLeftRight:1]; 
    } 
    else if (rightButton.active == TRUE) 
    { 
     [self moveLeftRight:2]; 
    } 
} 

MISE À JOUR:

Il est fixé :)

-(void) update:(ccTime)deltaTime 
{ 
    car = [car boundingbox]; 

    [self ifEdgeOfScreen]; 
    [self accelerate]; 



    for (CCSprite *itemFromArray in itemsArray) 
    { 
     if (CGRectIntersectsRect(carRect, [itemFromArray boundingbox])) 
     { 
      NSLog(@"Collision!"); 
     } 
    } 

    if (leftButton.active == TRUE) 
    { 
     [self moveLeftRight:1]; 
    } 
    else if (rightButton.active == TRUE) 
    { 
     [self moveLeftRight:2]; 
    } 
} 
+0

pouvez-vous écrire le code pour intersection aussi? Comment accédez-vous aux objets? Comme il va montrer comment vous gérez la collision ... :) –

+0

Hey Nikhil Aneja! J'ai ajouté plus de code dans la question :) Merci d'avance! – Yongzheng

Répondre

0

J'ai trouvé tant de problèmes avec le code ....

  1. Quand vous appelez removeAllChildren .. Assurez-vous que vous supprimez également les objets du tableau .. Suppression de l'image-objet de parents ne le supprime pas du tableau.

  2. Mettez à jour le rect de voiture dans la méthode de mise à jour. Donc, dans votre méthode de mise à jour

    - (void) mise à jour: (ccTime) deltaTime {

    [self ifEdgeOfScreen]; 
    
        [self accelerate]; 
    
        carRect = [car boundingBox]; 
    ........... 
    } 
    

Hope this helps .. :)

+0

Heya Nikhil Aneja. J'ai déjà résolu le problème: D Je viens de changer cela: pour (CCSprite * itemFromArray dans itemsArray) { CGRect itemRect = [itemFromArray boundingBox]; si (CGRectIntersectsRect (carRect, itemRect)) { NSLog (@ "Collision!"); } } à cette pour (CCSprite * itemFromArray à tabEléments) { si (CGRectIntersectsRect (carRect, [itemFromArray BoîteDeContour])) { NSLog (@" Collision ");! } } et bien sûr j'ai ajouté le carRect = [voiture boundingbox] :) Merci pour votre aide! – Yongzheng