1

我有一个CCLayer包含许多其他CCLayers (如文本项目等)。我CCLayer在左侧有另一个我想显示这些“场景”的缩略图。

左手CCScrollLayer应响应其范围内的触摸,而右手层中的元素应响应其各自范围内的触摸。

我看到的问题是,当我在右侧拖动一个图层时,CCScrollLayer左侧的响应和滚动。当我滚动滚动层时,右侧的元素不受影响。好像CCScrollLayer' 的边界太大了,这不是因为我什至故意将它们设置为 100 像素宽。在这里工作是否有无法解释的行为?

效果可见http://imageshack.us/photo/my-images/210/dragd.png/

4

2 回答 2

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;
}

只是不要忘记将触摸的 UI 坐标转换为 GL。如果此方法返回 YES,则任何其他层都不会收到此触摸。

于 2012-06-16T01:33:58.450 回答
0

谢谢@Morion,就是这样。我的检测方法是这样的。

   StoryElementLayer *newLayer = nil;
   for (StoryElementLayer *elementLayer in self.children) {
        if (CGRectContainsPoint(elementLayer.boundingBox, touchLocation)) {            
            newLayer = elementLayer;
            break;
        }
    }   
于 2012-06-16T10:21:04.113 回答