屏蔽方法:
进入新的CCLayer时:
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:kCCMenuHandlerPriority swallowsTouches:YES];
离开此CCLayer时调用
[[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
重写方法
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
解释:
由于CCMenu 按钮接受按键的优先级为-128(值越小优先级越高),所有不论处在那一层都会接收到点击
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:kCCMenuHandlerPriority swallowsTouches:YES];
priority: 优先级 kCCMenuHandlerPriority(-128)
swallowsToucher: 是否吃掉按钮不叫其他层再接收了 如果为NO其他层还是一样会接收到Touch数据
注意离开此CCLayer时一定要调用
[[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
否则下面层将不再接收按键
如果想在Layer A上添加一层Layer B, 想在B上点击不影响A 需要先把B层的触摸优先级调高一些
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:kCCMenuHandlerPriority-1 swallowsTouches:YES];
然后重写下面的函数- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
返回YES; 是扔掉触摸点,程序不在处理
返回NO是不扔掉触摸点,继续处理,但是底层A还是会接收到触摸点,还要继续处理
那么我们就把B需要的处理的按钮范围返回NO,不需要处理的返回YES就可以了 例如:
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint touchLocation = [touch locationInView: [touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
// 排除提示层的按钮
NSInteger nChildCount = self.children.count;
for (int i=0; i<nChildCount; ++i) {
id object = [self.children objectAtIndex:i];
// 判断是否是按钮菜单
if ([object isKindOfClass:[CCMenu class]]) {
CCMenu *menu = (CCMenu*)object;
for (int j=0; j<menu.children.count; ++j) {
CCMenuItemImage *item = [menu.children objectAtIndex:j];
CGPoint local = [item convertToNodeSpace:touchLocation];
CGRect r = [item rect];
r.origin = CGPointZero;
if( CGRectContainsPoint( r, local ) ){
if(item.isEnabled == NO)
return YES;
return NO;
}
} //end of for
} // end of if
} // end of for
return YES;
}
如果 需要添加自定义区域的话,可以自己在里面添加判断
删除离开Layer B的时候一定要添加
[[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
否侧 程序会出问题