2012-05-07 4 views
0

У меня есть несколько спрайтов, помещенные на фоне спрайта, как это:Cocos2d Спрайты Столкновение

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

[self addchild:bg]; 

А потом я добавляю свои элементы на Б.Г.

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

[bg addchild:items]; 

Ох, и не забывая при этом свой автомобиль спрайт

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

Я использую цикл, чтобы добавить несколько спрайтов на bg.

Теперь вопрос заключается в том, как определить, столкнулся ли автомобиль с несколькими спрайтами, которые я разместил на bg?

Я пробовал использовать CGRectIntersectsRect, и он не работает.

Я пробовал использовать метод теоремы pythagoras, и снова это не работает.

Был метод, который включал добавление элементов спрайтов в NSMutableArray, и он тоже не работает.

Может кто-нибудь предложить метод, с помощью которого я могу попробовать?

Дополнительный код:

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

UPDATE:

Это фиксируется :)

-(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

вы можете написать код для пересечения также? Как вы получаете доступ к объектам? Как он покажет, как вы справляетесь с столкновением ... :) –

+0

Hey Nikhil Aneja! Я добавил больше кода в вопрос :) Спасибо заранее! – Yongzheng

ответ

0

Я нашел так много проблем с кодом ....

  1. Когда вы звоните removeAllChildren .. Удостоверьтесь, что вы также удаляете объекты из массива. Удаление спрайта от родителей не удаляет его из массива.

  2. обновить автомобиль в обновлении. Таким образом, в методе обновления

    - (Недействительное) обновление: (ccTime) DeltaTime {

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

Надеется, что это помогает .. :)

+0

Heya Nikhil Aneja. Я уже решил проблему: D Я только что изменил это: для (CCSprite * itemFromArray в itemsArray) { CGRect itemRect = [itemFromArray boundingBox]; if (CGRectIntersectsRect (carRect, itemRect)) { NSLog (@ "Столкновение!"); } } к этому для (CCSprite * itemFromArray в itemsArray) { если (CGRectIntersectsRect (carRect, [itemFromArray BoundingBox])) { NSLog (@" Столкновение ");! } } и, конечно же, я добавил carRect = [car boundingbox] :) Спасибо за вашу помощь! – Yongzheng

Смежные вопросы