cocos2d-x jsb 防止触摸事件传递

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

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

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

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

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

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

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

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

可是在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); htm

虽然和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 !