cocos2d-js 自定義事件監聽派發

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

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的結構比較麻煩,每一個事件都不同。this

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

    //進入後臺 
    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事件,只須要一個簡單字符串+一個函數便可。prototype

參數event是這樣的結構:code

Image(35)

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

 

觸發自定義事件的方式,也跟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]();
        }
    }
}
相關文章
相關標籤/搜索