Самый простой и простой способ решить вашу проблему, IMO, это использовать 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 каждому из его слоев CCLay по одному на основе z-порядка (т. Е. Начинается с верхнего слоя до нижнего слоя) до тех пор, пока какой-либо из слоев не будет поглощать касание. Таким образом, если слой наверху (например, управляющий слой) потребляет касание, касание не будет распространено на следующий уровень (например, объектный слой). Таким образом, каждый слой должен заботиться о себе, чтобы решить, использовать ли сенсорный экран или нет. Если он решает, что касание не может быть использовано, то он просто не должен потреблять касание (вернуть NO из ccTouchBegan), и касание будет автоматически распространяться по слоям.
Надеюсь, это поможет.