`
CrackRen
  • 浏览: 168161 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

屏蔽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];

否侧 程序会出问题

分享到:
评论

相关推荐

    ccmenu:CCMenu是一个Mac应用程序,用于监视连续集成服务器

    CC菜单CCMenu将连续集成服务器上项目的构建状态显示为Mac菜单栏中的项目。 它作为CruiseControl项目的一部分开始,该项目构建了第一个连续集成服务器。 有关文档和支持,请访问 。 要下载并安装CCMenu,请访问 。 ...

    是男人就下100层游戏

    另外,专门定义了一个 HideLayer ,目的是实现弹出对话框的效果,考虑到原场景中可能会有CCMenu,我将该 Layer 的 优先级设为了 与 CCMenu 相同,因为后添加的原因,所以总能屏蔽Menu 的事件, 而且在 Layer 上再...

    CCMenu-开源

    在Mac OS X菜单栏中显示连续集成服务器的状态。 与所有支持“ cctray”提要的服务器一起使用,其中包括ThoughtWorks Go,Jenkins,Travis等。

    Cocos2d-x UI开发之菜单类使用实例

    菜单是我们在开发中经常用到的元素,cocos2d-x中的菜单基本上是分装了文本类和精灵类,代码注释有详细的说明,看代码吧!   bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::...

    cocos2dx 雷电MoonWarriors_游戏源码

    CCMenu *menu = CCMenu::create(pause, NULL); menu-&gt;setAnchorPoint(ccp(0, 0)); addChild(menu, 1, 10); menu-&gt;setPosition(CCPointZero); // 调 update函数 scheduleUpdate(); // 每秒调一次 ...

    CutTheRope-x:使用由cocos2d-x 2.1.3提供支持的游戏中关卡编辑器来像《割绳子》游戏

    使用Cocos2d-x 2.1.3制作的带有游戏内关卡编辑器的CutTheRope类似游戏演示。 该游戏具有便携性,可以在ios和android上运行。... 因此,我只使用CCMenu来显示级别菜单。 参考: 执照: 做您想公开许可的事情( )。

    green_team_watch:绿色团队观看应用程序

    git pull --rebase grunt pre-commit 修复任何错误git push检查构建状态要查看构建状态并获取有关构建状态的通知: 访问并点击屏幕右上角的“CCTray” 将 XML 配置添加到开发机器上的 CCTray 或 CCMenu 您还可以在...

    blue_team_watch:蓝队观看应用程序

    将 XML 配置添加到开发机器上的 CCTray 或 CCMenu 您还可以在此处访问 CI 服务器并查看构建状态 技术栈 技术堆栈中有许多部分,但其中许多只是为了提供自动化,不必为了构建 Proto Watch 应用程序而接触或理解。 ...

    purple_team_watch:紫色团队观看应用程序

    将 XML 配置添加到开发机器上的 CCTray 或 CCMenu 您还可以在此处访问 CI 服务器并查看构建状态 技术栈 技术堆栈中有许多部分,但其中许多只是为了提供自动化,不必为了构建 Proto Watch 应用程序而接触或理解。 ...

    Watch-Edition-VenusPractice:这是一个练习 Backbone.js 的练习

    将 XML 配置添加到开发机器上的 CCTray 或 CCMenu 您还可以访问 CI 服务器并在此处查看构建状态 技术栈 技术堆栈中有许多部分,但其中许多只是为了提供自动化,不必为了构建 Proto Watch 应用程序而接触或理解。 ...

    watch_edition_I_like_turtles:回购喜欢海龟的团队

    将XML配置添加到开发计算机上的CCTray或CCMenu 您也可以在此处访问CI服务器并查看构建状态 科技栈 技术堆栈中有很多组件,但是其中许多组件只是为了提供自动化功能,而无需为构建Proto Watch应用程序而动容或理解...

    watch_edition_jessie:杰西团队的回购

    将XML配置添加到开发计算机上的CCTray或CCMenu 您也可以在此处访问CI服务器并查看构建状态 科技栈 技术堆栈中有很多组件,但是其中许多组件只是为了提供自动化功能,而无需为构建Proto Watch应用程序而动容或理解...

    melb_watch_edition_red:为墨尔本红队回购

    将XML配置添加到开发计算机上的CCTray或CCMenu 您也可以在此处访问CI服务器并查看构建状态 科技栈 技术堆栈中有很多组件,但是其中许多组件只是为了提供自动化功能,而无需为构建Proto Watch应用程序而动容或理解...

    buildnotify:基于系统任务栏的构建状态通知应用程序,用于cctray.xml提要

    buildnotify:基于系统任务栏的构建状态通知应用程序,用于cctray.xml提要

Global site tag (gtag.js) - Google Analytics