Обнаружение длительного касания

#cocos2d-iphone

#cocos2d-iphone

Вопрос:

Мне нужно обнаружить длительное касание в игре, в игре, которую я пытаюсь создать.Как я могу это сделать?
Другая проблема, с которой я сталкиваюсь, заключается в ограничении одновременных касаний. т. е. спрайт не будет прыгать, если пользователь коснется более двух раз сразу один за другим.
Также является ли это способом, с помощью которого я могу добавить коэффициент продолжительности касания к высоте прыжка, совершаемого спрайтом?

Спасибо

Ответ №1:

как вы фиксируете свои касания? Я всегда использую следующие методы:

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

- (void)ccTouchMoved:(UITouch *)touchx withEvent:(UIEvent *)event

- (void)ccTouchEnded:(UITouch *)touchx withEvent:(UIEvent *)event
  

И с помощью этих методов вы можете получить полный контроль над всеми касаниями. Например, запомните время начала касания:

 self.startTime = [NSDate date];
  

для переменной экземпляра startTime или для проверки, принадлежит ли касание определенному объекту:

  CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
  

Таким образом, вы можете легко реализовать свою сенсорную логику так, как вам нравится…

Я нахожу, что хороший способ сделать это — определить все необходимые переменные внутри объекта игры, например…

 @interface Enemy : CCSprite <CCTargetedTouchDelegate> {

    EnemyState state;
    NSInteger enemyID;
    NSDate *startTime;
    NSDate *endTime;

    UITouch *lastTouch; 
  

ДОБАВЛЕНО, ЧТОБЫ ПОКАЗАТЬ КОНКРЕТНЫЙ ПРИМЕР КОДА Для ccTouchBegan:

    - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
    {
        D_DBG (@"ENEMY ID %i",self.enemyID);

//implement your logic if a touch for this enemy is allowed or not
        if (![self.delegate touchIsAllowed: enemyID touch: touch]) return NO;

//if the enemy is untouched, then may be touched
        if ((state == kEnemyStateUngrabbed) amp;amp;  (![self containsTouchLocation:touch] )) return NO;

        state = kEnemyStateGrabbed;
        self.startTime = [NSDate date];
        [self.delegate  informAboutEnemyStarted: self.enemyID startTime: self.startTime atPoint: self.position];
    return YES;
    }
  

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

1. Спасибо. Но как startTime означает начало касания?

2. В событии — (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *) вы находите объект, к которому прикасались, а затем устанавливаете для него переменную startTime. То же самое в конце в событии — (void)ccTouchEnded:(UITouch *)touchx с событием:(UIEvent *). Вам просто нужно самостоятельно отправлять каждое касание и проверять, какой объект имелся в виду. Но это делается почти автоматически, если вы используете эти методы… —> не забудьте [[CCTouchDispatcher sharedDispatcher] Добавить targeteddelegate: приоритет врага: 0, проглатывать касания: ДА];, чтобы враг мог проглатывать касания, в которых враг является экземпляром Enemy

3. Спасибо. Я понял, что ты сказал. Позвольте мне реализовать вышесказанное.