防止触摸通过CCLayer

时间:2012-06-20 06:54:40

标签: iphone ios cocos2d-iphone

我有一个CCLayer,我用它作为暂停菜单。它占据整个屏幕,但目前允许触摸通过它。

我想防止触摸通过它,但我遇到了一些困难。这就是我所拥有的:

-(id)init{
    if(self = [super init]){
        CGSize s = [[CCDirector sharedDirector] winSize];
        self = [CCLayerColor layerWithColor: ccc4(11, 153, 223, 255) width: s.width height: s.height];
        self.position = CGPointZero;
        self.isTouchEnabled = YES;
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];

    }
    return self;
}

但是,图层上的触摸会导致崩溃,但似乎也能够通过它。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Layer#ccTouchBegan override me'

防止触摸通过此cclayer的最简单方法是什么?感谢

2 个答案:

答案 0 :(得分:4)

将图层添加为目标触摸委托后,必须实现CCTargetedTouchDelegate方法。至少

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

此方法是必需的。其他是可选的。并且您不应该以这种方式将图层添加为触摸委托。 CCLayer类中有一个方法

- (void) registerWithTouchDispatcher

覆盖它并放置你的行

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];

如果你想在一段时间内通过这一层传递触摸,你可以写下这一行

[myLayer setIsTouchEnabled: NO];

或者如果你想在某些矩形中捕捉到触摸,你必须在ccTouchBegan:withEvent:方法中实现你的逻辑。如果此方法返回NO,则此触摸可由任何其他触摸委托处理。如果此方法返回YES,则此触摸不会传递给任何其他触摸代理

答案 1 :(得分:0)

基本上,所有的cocos2d图层都在一个单独的UIView中,并且所有的触摸都不是这个层,而是通过这个UIView。 为了防止触摸,您可以尝试从CCTouchDicpatcher中删除委托图层isTouchEnabled属性中的委托给NO