#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. Спасибо. Я понял, что ты сказал. Позвольте мне реализовать вышесказанное.