在游戏中要实现消息弹窗,让用户点击确认,其他区域产生遮罩,阻挡下层的事件被点击到,这是个很常用的功能,在cocos2d-x中,可以通过为layer添加事件代理来实现:

pDirector->getTouchDispatcher()->addTargetedDelegate(this, priority, swallowsTouches);

三个参数分别是要添加触摸事件的node, 事件优先级(默认的-128, 是最小的数字, 具有最高优先级),是否吞噬触摸事件(true为停止事件传递)

这里简单说下2dx中的事件传递模型,这应该也是 2dx被开发者吐槽最多的地方:

* 2dx中的事件代理分为标准代理(addStandardDelegate)和目标代理(addTargetedDelegate);

* 标准代理是部分node默认的属性,通过setTouchEnbled开启和关闭,有四个实现接口: onTouchesBegan, onTouchesMoved, onTouchesEnded, onTouchesCancelled

* 目标代理代理事件可以自定义给node, 通过上述 addTargetedDelegate开启, 同样也有四个实现接口:onTouchBegan...  (注意此处没有es,  而且began函数需要返回true or false, false的话,后续moved, ended等将不会生效);

* 一个触摸事件被接受后,从优先级高的开始逐个触发, 遇到swallows, 则停止;

但是在cocos2d-x js binding中没有实现addTargetDelegate的绑定, demo中都不能使用, 即使是最新的2.1.4版本也没有,遇到了些问题,让这个绑定一直延迟发布,有兴趣可以看这里:https://groups.google.com/forum/#!msg/cocos2d-js-devel/pKycy8iI1n4/Cn8KI5Or_PgJ

在jsb中有个替代的实现:cc.registerTargettedDelegate(priority, swallowsTouches, this); 

虽然和cocos2d-html5的接口不同,但是可以先使用, 具体使用如下:

为遮罩层之上的菜单添加最高优先级, 为遮罩层设置目标触摸事件的代理, 实现onTouchBegan的接口,注意这里需要返回true, 否则 swallowsTouches不会生效;

var menuGroup = cc.Menu.create(btn1, btn2);
menuGroup.setTouchPriority(cc.MENU_HANDLER_PRIORITY-2);

cc.registerTargettedDelegate(cc.MENU_HANDLER_PRIORITY-1, true, confirmLayer);
confirmLayer.onTouchBegan = function(){cc.log("touches confirm layer! block touchEvent bubble!");return true;};

最后,在结束该窗体后,记得调用:

cc.unregisterTouchDelegate(confirmLayer);

=================================

备注:对于cocosbuilder上创建的layer, 使用registerTargettedDelegate会遇到控制问题,暂时先使用脚本创建;

Good Luck !

cocos2d-x jsb 防止触摸事件传递的更多相关文章

  1. iOS 和 Android 触摸事件传递

    先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...

  2. UIView的clipsToBounds属性,layoutSubViews及触摸事件传递(默认情况下)总结

    一.UIView的clipsToBounds属性 * 默认情况下,超出父控件尺寸范围的子控件还是可见的 * 如果设置父控件的clipsToBounds=YES,就会裁剪掉超出父控件尺寸范围内的子控件, ...

  3. Android触摸事件传递机制

    简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...

  4. Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

  5. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  6. Android_触摸事件传递机制

    Android中dispatchTouchEvent,onInterceptTouchEvent, onTouchEvent的理解ecandroid中的事件类型分为按键事件和屏幕触摸事件,Touch事 ...

  7. Android: 详解触摸事件如何传递

    当视图的层次结构比较复杂的时候,触摸事件的响应流程也变得复杂. 举例来说,你也许有一天想要制作一个手势极其复杂的 Activity 来折磨你的用户,你经过简单思索,认为其中应该包含一个 PageVie ...

  8. Android触摸事件流程剖析

    Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 onTouchEvent触摸事件处 ...

  9. 图解Android触摸事件分发

    Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...

随机推荐

  1. 如何忽略usb host 模式设备连接确认对话框

    <li class="alt"><span><span>package android.hardware.usb;  </span> ...

  2. Fast UI Draw (Intel出品)

    Fast UI Draw in a library that provides a higher performance Canvas interface. It is designed so tha ...

  3. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件

    折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧. 其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine ...

  4. Android Service 生命周期和使用注意项

    一.基础知识 服务一般分为两种: 1:本地服务, Local Service 用于应用程序内部.在Service可以调用Context.startService()启动,调用Context.stopS ...

  5. .Net remoting, Webservice,WCF,Socket区别

    传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...

  6. 结构体dict_field_t

    typedef struct dict_field_struct dict_field_t; typedef struct dict_field_struct dict_field_t; /** Da ...

  7. bzoj1492

    好题+神题,首先肯定是dp,我们设f[i]为到第i天能获得的最多的B卷(设获得的钱数亦可)由题目hint可知,要么全买要么全卖,我们有f[i]=max(maxmoney,f[j]*b[i]+f[j]* ...

  8. [转] acmer必看的26个对acm态度

    acmer必看的26个对acm态度   转载自:http://www.cppblog.com/Darren/archive/2009/08/03/92099.html Attempt Keep on ...

  9. 排列的学习(java)

    1.无重复排列 2.有重复排列 3,下一个排列 package 生成排列; public class Main { static int count=0; //a中保存原来的排列,lev表示选定第几个 ...

  10. Mac中下载JDK手动更新出现“只支持10.7.3以上的系统版本”问题解决方案

    今天倒腾Hadoop,要修改源码,由于之前搞研究是基于hadoop1.0.3来做的,所以这次也用的这个版本,但是我电脑上Java的版本是1.8以上的,结果用ant编译hadoop源码报错,错误大概是这 ...