ccTouchesBegan против ccTouchBegan — обнаружение касания и сбой SIGABRT

#objective-c #cocos2d-iphone #touch #sigabrt

#цель-c #cocos2d-iphone #коснитесь #sigabrt #objective-c

Вопрос:

В настоящее время я создаю приложение, в котором пытаюсь определить положение касания пользователя.

Я перешел с ccTouchBegan на ccTouchesBegan в процессе реализации функции «определение положения касания».

Но я не могу заставить его работать. Я перешел с ccTouchBegan на ccTouchesBegan:

 -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  

вместо того, чтобы использовать:

  -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
  

Когда я сделал это, все это вылетает, когда я нажимаю на экран. Генерация ошибки SIGABRT с подсветкой:

 #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
NSAssert(NO, @"Layer#ccTouchBegan override me");
return YES;
}
#endif
@end
  

Итак, мои вопросы таковы:

Как вы думаете, почему он выходит из строя?

В чем разница между ccTouchBegan и ccTouchesBegan? Возможности мультитач?

Для получения дополнительной помощи, это мой код:

 -(id) init
    {
    if( (self=[super init])) {

        [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
        self.isTouchEnabled = YES;

        // Set up background
        background = [CCSprite spriteWithFile:@"Image.png"];
        background.scaleX = 1;
        background.scaleY = 1;
        background.position = ccp(0,0);
        [self addChild:background];


        [[CCTouchDispatcher sharedDispatcher]addTargetedDelegate:self
                                                        priority:0
                                                 swallowsTouches:YES];

        // Preload sound effect
        soundFile = [SimpleAudioEngine sharedEngine];
        if (soundFile != nil) {
            [soundFile preloadBackgroundMusic:@"sound.wav"];
        }


    }
    return self;
    }


    -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    NSLog(@"ccTouchesBegan");
    // Sets the sound variable to YES
    ifOne = YES;

    prevPos = [touch locationInView:[touch self]];
    prevPos = [[CCDirector sharedDirector] convertToGL:[touch locationInView:touch.self]];

    [self schedule:@selector(timerUpdate:) interval:0.1];
    //return YES; 
    }
  

Ответ №1:

Это приятная функция в cocos2d, которая позволяет проглатывать касания в тех случаях, когда требуется обработать только одно событие касания.

Попробуйте добавить эту функцию в свой класс:

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

Комментарии:

1. Не забывайте, что вам придется удалить self как делегата касания, и вы должны сделать это в -(void) cleanup; метод, потому что диспетчер касания может сохранить экземпляр self.

Ответ №2:

  • ccTouchesBegan происходит в ту секунду, когда вы касаетесь экрана
  • ccTouchesEnded происходит в ту секунду, когда вы отпускаете после нажатия на экран

и вместо

 -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
instead of using:
 -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
  

попробуйте использовать

 -(void)ccTouchesBegan:(UITouch *)...
  

или

 -(void)ccTouchesBegan:(NSSet *)...
  

или

 -(BOOL)ccTouchesBegan:(NSSet *)...
  

ваша проблема может быть просто в недопустимых типах данных или в какой-то подобной ерунде, мой совет — просто попробуйте переключить типы касаний.

Я бы дал больше информации, но вы не предоставили много информации для работы, так что это лучшее, что я могу сделать.