cocos2d: обнаружение столкновений работает неправильно - PullRequest
0 голосов
/ 24 февраля 2012

Привет всем, у меня проблемы с обнаружением столкновений.

у меня есть первый метод, который добавляет случайные объекты

-(void)initObjects{

    int randomNumber = arc4random() % 5 + 1;

    switch (randomNumber) {
        case 1:
            [self initEnemy];
            CCLOG(@"Random number 1");
            break;

        case 2:
            [self initJetpack];
            break;

        case 3:
            [self initWine];
            break;

        case 4:
          //  [self initNight];
            break;

        default:
            CCLOG(@"no number");
            break;
    }

}

тогда, когда выберете способ, которым родился объект, и если обнаружит столкновение, удалите добавленный спрайт

код в каждом методе объектов

[self schedule:@selector(collision) interval:1 / 60];

метод столкновения:

-(void)collision {
  if (CGRectIntersectsRect([_hero boundingBox], [_enemy boundingBox])) {
        CCLOG(@"Enemy collision intercect");
        [self spriteMoveFinished:_enemy]; // It's method like  [self removeChild:_enemy cleanup:YES];
        [self unschedule:@selector(collision)];
    }   else if (CGRectIntersectsRect([_hero boundingBox], [_powerNight boundingBox])) {
        CCLOG(@"PowerNight collision intercect");
       // the same up
    } else if (CGRectIntersectsRect([_hero boundingBox], [_wine boundingBox])) {
         CCLOG(@"Wine collision intercect");
       // the same up
    } else if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) {
        CCLOG(@"Jetpack collision intercect");
        //the same up
    }
 }

теперь интересный журнал

JetPack инициализирован Винные столкновения перехватывают (?????????) почему вино ??

враг инициализирован Jetpack столкновения перехватывают (?????), почему jetPack ??

Но иногда все нормально

враг инициализирован перехватить противника

Где я не прав?

спасибо всем, кто вас приветствует

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

да, омега, вы правы, во-первых, я допустил ошибку.

спрайт находится в CCSpriteBatchNode, и я позвонил так:

[self addChild:nameSprite];

iизменилось вот так (оригинальный код)

self.jetPack = [CCSprite spriteWithSpriteFrameName:@"jetpack-4.png"];       
_jetPack.position = ccp(480, randomNumber);
[_batchNode addChild:_jetPack z:3 tag:3];

теперь я пробую много возможностей и меняю метод столкновения

-(void)collision:(ccTime)dt andTag:(int)tag {


if (_enemy){

    if (CGRectIntersectsRect(_enemy.boundingBox, _hero.boundingBox)) { 
        CCLOG(@"Enemy collision intercect");
        [self spriteMoveFinished:_enemy andTag:6];
        [self unschedule:@selector(collision)];
    }
}// Continue with another collision

Я хотел попробовать ширину "тега", но не работает

метод, в котором рожденный спрайт вызывает коллизию

[self schedule:@selector(collision:andTag:) interval:1/60];

в методе init есть метод генератора объектов со случайным числом

     [self schedule:@selector(initObjects) interval:8];

спрайты успевают умереть

в журнале всегда один и тот же

рожден спрайт правильно, и когда есть какое-то столкновение, иногда хорошо, а иногда нет.

это как simulatore путает спрайт, но странно:

если спрайт _jetPack, у меня есть контроль структуры, если-как еще возможно, чтобы спрайт вошел в столкновение _enemy ??

я надеюсь, что это хорошо объяснено.

спасибо

0 голосов
/ 24 февраля 2012

Ну, во-первых, было бы хорошо проверить наличие каждого из этих объектов, прежде чем пытаться проверять столкновения.Например:

if (_jetPack) {  // Check if jetPack exists
    if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) {

    }
}

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

...