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 !

相關文章
相關標籤/搜索