屏蔽方法:
進入新的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];
否側 程序會出問題