Обработка двойного нажатия в Cocos2d - PullRequest
0 голосов
/ 13 сентября 2011

Этот вопрос слишком примитивен, но я пытался последние 8 часов, и он поглощает мою энергию (и уровень уверенности тоже:))

В моем классе я зарегистрировался на Targetedкасания.

  [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:YES];

Я хотел бы проверить, выполняет ли пользователь одно касание или двойное касание.В методе ccTouchBegan сначала выполняется касание с помощью singleTap, а затем выполняется касание с помощью doubleTap.Я нашел очень интересное решение для этого на одном из форумов Cocos2d.(Я не могу найти его сейчас ..)

Решение выглядит следующим образом.

switch (touch.tapCount) {
            case 2:
                [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTouch:)  object:singleTouchLocation];
             // Handle Double Touch here
                break;
            case 1:


                self.singleTapLocation = ccp(location.x,location.y);
                self.singleTouchLocation = touch;

                [self performSelector:@selector(handleSingleTouch:) withObject:touch afterDelay:0.3
             ];



                break;
        }

Все выглядит нормально.По сути, вы планируете обработчик одним касанием с задержкой и смотрите, действительно ли это двойное касание.Если это двойное касание, отмените обработчик одно касания и выполните логику для двойного касания.

Но моя проблема в том, что в обработчике с одним касанием (handleSingleTouch) я добавляю CCSprite в пользовательский интерфейс.Это действие не работает.Спрайт не добавляется.(Хотя метод называется.).На самом деле это работает, если я вызываю селектор без задержки, но с задержкой, спрайт не добавляется.

Я не эксперт по Objective C, поэтому я прошу прощения, если вопрос слишком примитивен.

Редактировать 1: Оригинальный поток .

Редактировать 2: Отправка ручки SingleTouch .. только соответствующий код.

-(void) handleSingleTouch:(UITouch * ) touch  {

    CGPoint location = [touch locationInView: [touch view]];
    CGPoint glLocation = [MainSceneLayer locationFromTouch:touch];
    //Single tap
    CCLOG(@"Single tap: Adding marker image");


    if(zoomedOut) {

        CGPoint globalCoordinates = [quadConvertor convertLocalToGlobal:location 
                                                       inActiveQuadrant:activeQuadrant];



        if( [self isTouchValidForSelectedItem:globalCoordinates] == Matched) {
            [self addMarkerImages:glLocation];
        } else if([self isTouchValidForSelectedItem:globalCoordinates] == NotMatched) {
            [missedLabel stopAllActions];

            for (ImageQuadrants* quad in quadrants) { 
                if(quad.quadrantNumber == activeQuadrant) {

                    missedLabel.position  =  ccp((quad.center.x * -1)+glLocation.x  , (quad.center.y * -1)+glLocation.y);

                    //markers.position =  ccp((quad.center.x * -1)+touchPosition.x  , 320);


                }

            }


            id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
            id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible:)];



            id seq = [CCSequence actions:blinkAction, makeInvible,  nil];

            [missedLabel runAction:seq];

        } else {

            [alreadyAccountedLabel stopAllActions];

            for (ImageQuadrants* quad in quadrants) { 
                if(quad.quadrantNumber == activeQuadrant) {

                    alreadyAccountedLabel.position  =  ccp((quad.center.x * -1)+glLocation.x  , (quad.center.y * -1)+glLocation.y);

                    //markers.position =  ccp((quad.center.x * -1)+touchPosition.x  , 320);


                }

            }


            id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
            id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible1:)];



            id seq = [CCSequence actions:blinkAction, makeInvible,  nil];

            [alreadyAccountedLabel runAction:seq];


        }

    }


    swipeStartPoint = [touch locationInView:touch.view];


}

1 Ответ

1 голос
/ 14 сентября 2011

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

[self performSelector:@selector(handleSingleTouch:) withObject:touch afterDelay:0.1];

EDIT :

Поскольку ваша проблема, скорее всего, связана с потерей касания.Попробуйте [touch retain] перед вызовом отложенного метода.Другой способ - изменить метод handleSingleTouch:, чтобы он использовал два числа с плавающей точкой x и y или CCPoint в качестве аргументов вместо UITouch.Затем вы создаете float перед отложенным методом и передаете их в отложенный метод.Таким образом, вы также избежите утечки памяти при сохранении касания, поскольку, скорее всего, вы не сможете ее освободить после вызова отложенного метода.

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...