`
CrackRen
  • 浏览: 170818 次
  • 性别: 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];

否侧 程序会出问题

分享到:
评论

相关推荐

    cocos2d事件响应总结

    - `CCMenu`类继承自`CCLayer`,默认使用目标触摸委托,因此通常不会出现触摸事件的混乱问题。 #### 六、实践建议 - 在设计游戏或应用时,应根据具体需求选择合适的触摸事件分发机制。 - 对于需要精确控制触摸事件...

    Cocos2D-x游戏开发之菜单事件响应demo

    这里,`CCMenuItemFont::create`用于创建文本按钮,`this`表示当前类(通常是继承自`CCLayer`的类)作为接收事件的对象,`menu_selector`是Cocos2D-x提供的宏,用于将成员函数转换为可选动作。`startGame`和`...

    cocos2d 游戏菜单设置v1

    4. iOS事件处理:理解如何在Cocos2D中处理触摸事件,如`ccTouchBegan`、`ccTouchMoved`和`ccTouchEnded`。 5. 自定义动画:如何通过编写自定义的`CCAction`子类来创建独特的动画效果。 通过实践这个项目,你可以...

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

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

    cocos2dx3.0 英雄难过棍子关源码

    `CCMenuItem`和`CCMenu`类提供了创建菜单和按钮的功能,通过监听按钮事件,可以响应用户的操作,如开始新游戏、暂停游戏等。 四、得分与游戏进度 游戏的得分系统和进度保存通常涉及到数据持久化。cocos2dx提供了...

    是男人就下100层游戏

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

    Cocos2d-x中实现弹出对话框示例

    总之,Cocos2d-x中实现弹出对话框的关键在于创建一个新的层(`CCLayer`子类),并在其中添加背景、按钮等元素,同时处理触摸事件以实现交互。通过这样的方式,我们可以灵活地在游戏或应用中插入各种对话框,满足不同...

    cocos2d-x模态对话框的实现 vs2008实现 带工程

    通过`CCMenu::registerWithTouchDispatcher`方法注册触摸事件,然后在`onTouchBegan`, `onTouchMoved`, `onTouchEnded`等回调中实现逻辑。 6. **暂停和恢复游戏逻辑** 在显示模态对话框时,需要暂停游戏逻辑,例如...

    cocos2dApiMenu

    每个菜单项都可以响应用户的触摸事件,执行相应的操作。创建一个简单的菜单,你需要实例化CCMenuItem对象,并将它们添加到CCMenu中。例如: ```cpp CCMenuItem *item1 = CCMenuItemFont::create("Start", this, ...

    Cocos2D-X2.2.3学习笔记6(UI系统)

    你可以通过设置其回调函数来响应用户的触摸事件,实现交互功能。 2. **CCLabelTTF与CCLabelBMFont** 这两个类用于显示文本。CCLabelTTF使用TrueType字体,支持动态调整大小和颜色。而CCLabelBMFont则使用位图字体...

    cocos2d-x_学习文档

    每个`CCScene`可以包含一个或多个`CCLayer`,`CCLayer`则可以包含各种游戏对象如精灵(CCSprite)、菜单(CCMenu)等。通过`CCScene::create`方法可以创建一个新的场景实例,然后通过`CCDirector`的`runWithScene`...

    cosos2d-ios

    5. **触摸事件处理**:通过` CCTouchDispatcher `,开发者可以监听和响应用户的触摸操作,实现与游戏的交互。 6. **粒子系统(Particle System)**:cocos2d-iOS内置了强大的粒子系统,可以快速创建各种特效,如火、...

    iOS游戏应用源代码——LearnCocos2D-LearnCocos2D-f9ea793.zip

    4. **事件处理**: 了解如何监听和响应用户触摸事件,以及游戏内部的事件。 5. **音频管理**: 学习如何播放背景音乐和音效,控制音量和播放状态。 6. **物理引擎**: 熟悉物理引擎的使用,如设置重力,创建物理对象...

    coco2d-x场景切换具体办法

    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu-&gt;setPosition(CCPointZero); CC_BREAK_IF(!pMenu); this-&gt;addChild(pMenu, 1); // 添加背景图片 CCSprite *lyl = CCSprite::create("NewScenc.jpg...

    cocos2dx 学习资料

    触摸事件是移动平台上常见的用户输入方式。Cocos2d-x通过`CCTouchDispatcher`来管理和分发触摸事件。你可以通过继承`CCNode`并重写`onTouchBegan`, `onTouchMoved`, `onTouchEnded`等方法来实现触摸事件的监听。...

    Cocos2D-X2.2.3学习笔记5(UI系统)

    `CCMenu`类则用于管理一组`CCMenuItem`,它可以自动排列和对齐这些元素,方便创建菜单布局。 Cocos2D-X 2.2.3中还引入了`CCLabelTTF`和`CCLabelBMFont`来显示文本。`CCLabelTTF`支持TrueType字体,可以动态调整文字...

    cocos2d-x游戏开发系列教程-坦克大战游戏关卡选择场景的编写上

    cocos2d-x提供了丰富的API来处理这些任务,例如`CCDirector`用于控制游戏画面,`CCSprite`用于显示图像,`CCLabel`用于创建文本标签,`CCMenu`和`CCMenuItem`用于创建菜单和按钮。 接下来,我们将创建一个新的C++类...

    计算机软件及应用iOS应用程序开发方法与实践PPT课件.pptx

    节点包括场景(CCScene)、图层(CCLayer)、精灵(CCSprite)和菜单(CCMenu)等。每个节点都有一个锚点属性(anchorPoint),定义了变换和定位时的参照点,锚点值是以比例形式表示的,不局限于节点内部。节点还...

Global site tag (gtag.js) - Google Analytics