Ответ 1
Самый простой и простой способ решить вашу проблему - ИМО, используя ccTouchBegan
/Moved
/Ended
вместо ccTouchesBegan
/Moved
/Ended
. Смысл, вы решаете одно касание в определенный момент, чтобы избежать путаницы над несколькими касаниями, а также самой важной особенностью ccTouchBegan
является то, что CCLayer может "поглощать" прикосновение и не допускать его распространения на следующие уровни. Больше объяснений после примеров кода ниже.
Вот шаги для этого. Внедрите эти методы во всех подклассах CCLayer, которые должны обрабатывать события касания:
Сначала зарегистрируйтесь в CCTouchDispatcher:
- (void)registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
Далее, реализуем ccTouchBegan, пример ниже из игры, которую я создал (часть пропущена, конечно):
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
if (scene.state != lvlPlaying) {
// don't accept touch if not playing
return NO;
}
CGPoint location = [self convertTouchToNodeSpace:touch];
if (scene.mode == modePlaying && !firstTouch) {
if (CGRectContainsPoint(snb_putt.sprite.boundingBox, location)) {
touchOnPutt = touch.timestamp;
// do stuff
// return YES to consume the touch
return YES;
}
}
// default to not consume touch
return NO;
}
И, наконец, реализуем ccTouchMoved и ccTouchEnded, как и ccTouches *, но они обрабатывают одно касание, а не касаются друг друга. Прикосновение, которое передается этим методам, ограничено тем, которое потребляется в ccTouchBegan, поэтому нет необходимости делать валидацию в этих двух методах.
В основном так оно и работает. Событие касания передается CCScene каждому из своих CCLayers один за другим на основе z-упорядочения (то есть начинается с верхнего слоя на нижний уровень), пока ни один из слоев не поглотит прикосновение. Поэтому, если слой наверху (например, уровень управления) потребляет сенсорное касание, касание не будет передаваться на следующий уровень (например, слой объекта). Таким образом, каждый слой должен только беспокоиться о себе, чтобы решить, потреблять ли это прикосновение или нет. Если он решит, что сенсор не может быть использован, тогда он просто не должен потреблять прикосновение (возврат NO из ccTouchBegan), и прикосновение будет автоматически распространяться по слоям.
Надеюсь, что это поможет.