屏蔽CCMenu按鈕響應 (修改CCLayer上的觸摸優先級)

屏蔽方法:

 

進入新的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];

否側 程序會出問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章