2012-05-01 4 views
0

У меня обнаружение столкновений и его работа отлично, проблема в том, что всякий раз, когда мой «bird» попадает в «cloud», облачные диспуты и я получаю некоторые очки. То же самое происходит и для «sol», который он должен, но не с облаками.Cocos2d - действие при столкновении?

Как это можно изменить? ive много пробовал, но может показаться, что он выдумал.

Столкновение Код

- (void)update:(ccTime)dt { 
    bird.position = ccpAdd(bird.position, skyVelocity); 

    NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init]; 
    for (CCSprite *bird in _projectiles) { 
     bird.anchorPoint = ccp(0, 0); 
     CGRect absoluteBox = CGRectMake(bird.position.x, bird.position.y, [bird boundingBox].size.width, [bird boundingBox].size.height); 

     NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init]; 
     for (CCSprite *cloudSprite in _targets) { 
      cloudSprite.anchorPoint = ccp(0, 0); 
      CGRect absoluteBox = CGRectMake(cloudSprite.position.x, cloudSprite.position.y, [cloudSprite boundingBox].size.width, [cloudSprite boundingBox].size.height); 


      if (CGRectIntersectsRect([bird boundingBox], [cloudSprite boundingBox])) { 
       [targetsToDelete addObject:cloudSprite]; 

      }      
     } 

     for (CCSprite *solSprite in _targets) { 
      solSprite.anchorPoint = ccp(0, 0); 
      CGRect absoluteBox = CGRectMake(solSprite.position.x, solSprite.position.y, [solSprite boundingBox].size.width, [solSprite boundingBox].size.height); 


      if (CGRectIntersectsRect([bird boundingBox], [solSprite boundingBox])) { 
       [targetsToDelete addObject:solSprite];  
       score += 50/2; 
       [scoreLabel setString:[NSString stringWithFormat:@"%d", score]]; 
      }      
     } 



     // NÅR SKYEN BLIVER RAMT AF FUGLEN 
     for (CCSprite *cloudSprite in targetsToDelete) { 
      //[_targets removeObject:cloudSprite]; 
      //[self removeChild:cloudSprite cleanup:YES];  
     } 

     // NÅR SOLEN BLIVER RAMT AF FUGLEN 
     for (CCSprite *solSprite in targetsToDelete) { 
      [_targets removeObject:solSprite]; 
      [self removeChild:solSprite cleanup:YES]; 


     } 

     if (targetsToDelete.count > 0) { 
      [projectilesToDelete addObject:bird]; 
     } 
     [targetsToDelete release]; 
    } 

    // NÅR FUGLEN BLIVER RAMT AF ALT ANDET 
    for (CCSprite *bird in projectilesToDelete) { 
     //[_projectiles removeObject:bird]; 
     //[self removeChild:bird cleanup:YES]; 
    } 
    [projectilesToDelete release]; 

} 
+0

Я думаю, вы должны удалить эту строку: [targetToDelete addObject: cloudSprite]; – knagode

+0

Просто попробовал, работа –

ответ

1

Ну, как ваши облака и золь объекты находятся в одних и тех же _targets массива. Таким образом, если вы не проверите подходящий тип в своем цикле, вы не сможете выполнить требуемые действия ни на одном из них. Нечто подобное (в предположении, что облако и золь являются подклассами CCSprite):

for (CCSprite *cloudSprite in _targets) { 
    if(![cloudSprite isKindOfClass:[Cloud class]]) continue; 
    cloudSprite.anchorPoint = ccp(0, 0); 
    CGRect absoluteBox = CGRectMake(cloudSprite.position.x, cloudSprite.position.y, [cloudSprite boundingBox].size.width, [cloudSprite boundingBox].size.height); 
    if (CGRectIntersectsRect([bird boundingBox], [cloudSprite boundingBox])) { 
     [targetsToDelete addObject:cloudSprite]; 

    }      
} 

таким образом, вы только добавить облака targetsToDelete. Ключ состоит в том, чтобы отличить облако от золя в ваших _targets. Подклассификация является пуленепробиваемой. В противном случае вы можете реализовать его с использованием тегов, но это может быть более хрупкий дизайн. После того, как вы можете различать типы объектов в своих _targets, этот код можно легко оптимизировать (меньшее количество итераций на _targets и targetToDelete.

+0

im получение этой ошибки: использование необъявленного идентификатора «Cloud» - я думаю, что это [класс облаков], проблема здесь, как ее можно исправить? btw, спасибо за ответ! –

+0

Точка: я предполагал, что вы был подклассифицирован CCSprite для объектов Cloud и Sol. Точка, когда вы помещаете объекты CCSprite в массив _targets, вы в основном «забываете», что конкретный спрайт соответствует облаку или sol, если вы специально не разрабатываете для этого. в базу вашего кода входит подкласс CCSprite в класс Cloud и класс Sol. Таким образом, когда вы извлекаете объект из массива _targets, вы сможете выяснить, что это такое. – YvesLeBorg

+0

Не думаю, что я подклассифицировал любой из моих спрайтов, я просто сделал их так: CCSprite * sol; ect .. но если мне нужен подкласс, где я могу его прочитать, или вы знаете, как я могу сделать быстрый подкласс для двух спрайтов? –

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