cocos2d touch с параллаксом

У меня есть несколько слоев, и я добавил к ним несколько спрайтов; Пытаюсь получить к ним доступ таким образом:

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    if(CGRectContainsPoint([[self getChildByTag:tagNumber] boundingBox], location)) {
        CCLOG(@"You've touched the sprite!");
    }
}

странно то, что если нет этого метода:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    return YES;
}

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

ОБНОВЛЕНИЕ:

-(void) registerWithTouchDispatcher
{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self 
                                                     priority:0 swallowsTouches:YES];
}

person el.severo    schedule 21.12.2011    source источник


Ответы (2)


Если вы получаете событие ccTouchBegan, но не ccTouchesBegan (обратите внимание на множественное число), вы используете файл CCTargetedTouchDelegate протокол. Вероятно, вы зарегистрировали свой класс в CCTouchDispatcher addTargetedDelegate и поэтому должны придерживаться протокола CCTargetedTouchDelegate, методы которого являются единственными версиями ccTouchXXXX, а не ccTouchesXXXX.

Вы также должны прислушиваться к предупреждениям, которые показывает вам Xcode. Если вы не реализуете ccTouchBegan, я уверен, что может появиться предупреждение «может не отвечать на селектор». Ко всем предупреждениям следует относиться серьезно (на самом деле настолько серьезно, что я рекомендую включить «Рассматривать все предупреждения как ошибки»).

person LearnCocos2D    schedule 21.12.2011

Какие-нибудь ошибки выдаются в консоли? Что-то о непризнанном селекторе? Прошло некоторое время с тех пор, как я занимался cocos2D, но вы должны проверить, не переопределяет ли второй метод первый. Если это действительно так, то когда его не существует, ваша программа будет использовать первый (тот, который возвращает void), тем самым наткнувшись на реальную ошибку в реализации вашего кода. Я бы установил точку останова внутри первой строки '-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event', удалил функцию, которая возвращает BOOL, а затем шаг за шагом увидел бы, что произойдет, когда с помощью отладчика.

И, пожалуйста, выложите лог консоли. Я считаю, что у вас должна быть проблема «селектор не найден», «дочерний элемент не найден» или «исключение недопустимого аргумента из-за нулевого аргумента».

Просто мысль.

person csotiriou    schedule 21.12.2011
comment
вот мой журнал ; Попробовал то, что вы мне сказали, и мой метод ccTouchesBegan не вызывается - person el.severo; 21.12.2011