如何正确处理多层触摸事件?

时间:2012-10-29 23:14:42

标签: cocos2d-iphone

我目前有一个“控制台”CClayer,它正在处理添加到它的精灵的触摸检测。但是,我也有一些我想做触摸检测的精灵,它们不是Console层的一部分......它们目前是继承自CCNode的类的子代。

我的理解是,越多的cocos对象将“isTouchEnabled”属性设置为true,性能就会受到影响,所以我很好奇我应该如何处理它?<​​/ p>

我应该:

A)让控制台的touchesBegan方法检测属于CCNode的精灵吗?

B)只需在CCNode对象上实现isTouchEnabled

C)其他一些方法?

1 个答案:

答案 0 :(得分:0)

好吧,对于初学者来说,如果你担心的话,你应该只关注自己的表现,即你看到或测量(在DEVICES而不是模拟器上)一些不恰当的响应时间。

我会避免检测与另一个节点有关的触摸 - 它可能会变得混乱,软件明智。当触摸位于检测节点所关注的对象的位置时,我倾向于严格地返回YES(来自ccTouchBegan)。当您返回NO时,调度员将触摸传递给其他处理程序(在控制台下),直到一个这样的CCNode咬了一口。有点如下:

- (void) onEnter{
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
    [super onEnter];
}

- (void) onExit{
    [[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];
[super onExit];
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    if (!_visible || !_enabled) {
        return NO;
    }
    CGPoint loc = [touch locationInView:touch.view];
    loc = [[CCDirector sharedDirector] convertToGL:loc];

    if ([self containsPoint:loc]) {
        // do your thing here !
        return YES;
    }

    return NO;
}

-(BOOL) containsPoint:(CGPoint) location {
    // determine here whether this node should be handling
    // this touch.
}