Удалить спрайт из слоя, не удаляя прямоугольник с ним (Cocos2d)? - PullRequest
0 голосов
/ 25 мая 2011

Я делаю игру в Cocos2d. Пока все в порядке. Я использовал Ray Wenderlich's обучающий курс, чтобы заставить обнаружение столкновения работать. Это работает, но всякий раз, когда «враг» появляется там, где была удалена пуля (потому что удаленная пуля попала в цель, следовательно, была удалена), враг также автоматически удаляется. Я думаю, это потому, что он не удаляет прямоугольник, который был объявлен для спрайта. Обратите внимание, что он также может пройти более одного врага, даже если пуля удалена. Любая помощь приветствуется. Спасибо!

EDIT: Я выяснил, в чем проблема. У меня был метод съемки по расписанию: метод @selector, без заданного интервала. Это означало, что он будет стрелять быстро со скоростью 60 кадров в секунду. Так что я получил две пули с одним щелчком мыши. Они были так близко друг к другу, что мне потребовалось время, чтобы заметить это. Я не сделаю эту ошибку снова !!!

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Вы используете следующий код? (из Как создать простую игру для iPhone с помощью Cocos2D Tutorial )

- (void)update:(ccTime)dt {

  NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];
  for (CCSprite *projectile in _projectiles) {
    CGRect projectileRect = CGRectMake(
      projectile.position.x - (projectile.contentSize.width/2), 
      projectile.position.y - (projectile.contentSize.height/2), 
      projectile.contentSize.width, 
      projectile.contentSize.height);

    NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
    for (CCSprite *target in _targets) {
      CGRect targetRect = CGRectMake(
        target.position.x - (target.contentSize.width/2), 
        target.position.y - (target.contentSize.height/2), 
        target.contentSize.width, 
        target.contentSize.height);

      if (CGRectIntersectsRect(projectileRect, targetRect)) {
        [targetsToDelete addObject:target];             
      }                     
    }

    for (CCSprite *target in targetsToDelete) {
      [_targets removeObject:target];
      [self removeChild:target cleanup:YES];                                    
    }

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

  for (CCSprite *projectile in projectilesToDelete) {
    [_projectiles removeObject:projectile];
    [self removeChild:projectile cleanup:YES];
  }
  [projectilesToDelete release];
}

всякий раз, когда «враг» появляется там, где была удалена пуля, враг также автоматически удаляется.

Звучит, что пуля удалена из слоя, но не удалена из массива _projectiles.

    [_projectiles removeObject:projectile];

Вы уверены, что этот код работает?

0 голосов
/ 25 мая 2011

Rect не является отдельной сущностью от вашей пули. Rect - это свойство, связанное с пулей. Как только ваша «пуля будет удалена», прямоугольник перестанет действовать.

То, на что вы должны смотреть, это ваш код проверки столкновения.

Возможно, вы хотите окружить свой код проверки столкновения пуль следующим условием:

if(bullet exists)
{
    check for collision
}

Так как вы не опубликовали код, я мог бы разместить здесь только псевдокод. Может быть, если вы опубликуете свой код проверки столкновения, я мог бы показать вам более подробно.

...