cocos2d-js 自訂事件監聽派發

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   strong   for   

熟悉js的dom事件或者flash事件的,基本都能立馬明白cc.eventManager的用法。

cc.eventManager有兩種註冊監聽器的方式,一種是原生事件,例如

cc.eventManager.addListener({                 event: cc.EventListener.KEYBOARD,                 onKeyReleased: function(keyCode, event) {                     if (keyCode == cc.KEY.back) {                         cc.director.end();                     }                 }}, this);

addListener接受的是一個object。鍵盤事件、觸摸事件等都是這樣的。往往這個object的結構比較麻煩,每個事件都不一樣。

另外是customEvent,例如已經接觸過的進入後台和恢複事件:

    //進入後台     cc.eventManager.addCustomListener(cc.game.EVENT_HIDE, function(event){         cc.log("cc.game.EVENT_HIDE!");     });     //恢複顯示     cc.eventManager.addCustomListener(cc.game.EVENT_SHOW, function(event){         cc.log("cc.game.EVENT_SHOW");     });

這兩個事件就比較簡單,類似js和flash事件,只需要一個簡單字串+一個函數即可。

參數event是這樣的結構:

其中userData是dispatch的時候附帶的。

 

觸發自訂事件的方式,也跟js和flash一致:

cc.eventManager.dispatchCustomEvent("xxxxxevent", {a:1,b:2});

通過這個dispatch就能得到上邊圖片所示的內容。

 

但removeListener就多少有點不方便了。對自訂事件,只支援全部移除

removeCustomListeners: function (customEventName)

不能單獨移除某一個。

 

 

看官方的例子,貌似基本都不移除listener,可能js幾個object記憶體並不顯著吧。如果記憶體管理非常敏感的話,可能就需要自己寫一個了。

/*** Created by kenkozheng on 2014/8/20.*/var EventDispatcher = function() {    this.init();};var p = EventDispatcher.prototype;p._listenerMap = null;p.init = function(){    this._listenerMap = new Object();};/**** @param event String* @param callback function*/p.addListener = function(event, callback){    if(!callback || !event)        return;    var listenerList = this._listenerMap[event];    if(!listenerList)        listenerList = this._listenerMap[event] = new Array();    for (var i = 0; i < listenerList.length; i++) {        if(listenerList[i] == callback)            return;    }    listenerList.push(callback);};p.removeListener = function(event, callback){    if(!callback || !event)        return;    var listenerList = this._listenerMap[event];    if(listenerList)    {        for (var i = 0; i < listenerList.length; i++) {            if(listenerList[i] == callback)            {                listenerList.splice(i, 1);                return;            }        }    }};/**** @param event String*/p.dispatchEvent = function(event){    if(this._listenerMap[event])    {        var listeners = this._listenerMap[event].slice();        for (var i = 0; i < listeners.length; i++) {            listeners[i]();        }    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.