標籤: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](); } }}