在遊戲中要實現消息彈窗,讓用戶點擊確認,其餘區域產生遮罩,阻擋下層的事件被點擊到,這是個很經常使用的功能,在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 !