2012-06-15 4 views
1

У меня есть CCLayer, содержащий ряд других CCLayer s (например, элементы текста и т. Д.). У меня есть еще один CCLayer с левой стороны, с помощью которого я хочу отображать миниатюры ряда этих «сцен».Touch обработано двумя слоями

Левая рука CCScrollLayer должна отвечать на касания, находящиеся в пределах ее границ, в то время как элементы в правом слое должны реагировать на касания внутри их отдельных границ.

Проблема, которую я вижу, заключается в том, что когда я перетаскиваю, например, слой справа, CCScrollLayer слева реагирует и прокручивается. Элементы справа не затрагиваются, хотя я прокручиваю слой прокрутки. Это как если бы границы CCScrollLayer были слишком большими, а это не потому, что я даже поставил их специально на 100 пикселей в ширину. Есть ли необъяснимое поведение здесь?

Эффект можно увидеть на http://imageshack.us/photo/my-images/210/dragd.png/

ответ

1

По умолчанию CCLayer является регистр в качестве стандартного сенсорного делегата. Вы должны зарегистрировать его в качестве целевого делегата. В этом случае CCLayer может претендовать на прикосновение, и другие сенсорные элементы не получат его. Вы можете сделать это с помощью переопределения метода CCLayer

-(void) registerWithTouchDispatcher 
{ 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: self.priority swallowsTouches:YES]; 
} 

после этого вы должны заменить методы делегата с этим те

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; 
@optional 
// touch updates: 
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event; 

ваш метод ccTouchBegan:withEvent: должен быть как этот

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    BOOL shouldClaimTouch = NO; 
    BOOL layerContainsPoint = // check if current layer contains UITouch position 
    if(layerContainsPoint) 
    { 
     shouldClaimTouch = YES; 
    } 

    // do anything you want 

    return shouldClaimTouch; 
} 

просто не» t забыть преобразовать координаты пользовательского интерфейса Touch в GL. Если этот метод возвращает ДА, это касание не будет получено никаким другим слоем.

+0

Действительно ли этот ответ действует на момент последнего Cocos2D? Изменить: похоже, это текущий (тот же) ответ http://www.cocos2d-iphone.org/wiki/doku.php/tips:touchdelegates – Jonny

+0

Тем не менее официальная документация устарела. Имена протоколов давно изменились. – Jonny

0

Спасибо @Morion, вот и все. Мой метод обнаружения выглядит так.

StoryElementLayer *newLayer = nil; 
    for (StoryElementLayer *elementLayer in self.children) { 
     if (CGRectContainsPoint(elementLayer.boundingBox, touchLocation)) {    
      newLayer = elementLayer; 
      break; 
     } 
    } 
Смежные вопросы