自定義事件是當(dāng)其它事件不滿足用戶的時(shí)候可以自己定義。像傳遞值或者對(duì)象。
我們都知道創(chuàng)建一個(gè)監(jiān)聽器無非就是兩個(gè)步驟:一是創(chuàng)建Listener彤悔,二是添加到eventManage上噪服。但是EventCustom多了一個(gè)需要自己調(diào)度
dispatchCustomEvent或者dispatchEvent.
第一種方法:
首先是創(chuàng)建自定義Listener:
[java]?view plain?copy
this.listener?=?cc.EventListener.create({??
event:?cc.EventListener.CUSTOM,//事件類型---自定義??
eventName:"event_custom_name",???//事件名稱??
????????????callback:?function?(event)?{??
cc.log("event?=?"+event.getUserData());??
????????????}??
????????});??
然后是添加到eventManage上:
[java]?view plain?copy
cc.eventManager.addListener(this.listener,1);??
官方文檔是對(duì)后面那個(gè)1說是自定義事件時(shí)候的固定優(yōu)先級(jí)
最后是派發(fā),也就是調(diào)用
[java]?view plain?copy
var?event?=?new?cc.EventCustom("event_custom_name");??
event.setUserData("123");??
cc.eventManager.dispatchEvent(event);??
實(shí)例:
[java]?view plain?copy
var?EventCustomLayer?=?cc.LayerColor.extend({??
listener:null,??
????ctor:?function?()?{??
this._super();??
var?item?=new?cc.MenuItemFont("onclick",this.onclick);??
var?menu?=new?cc.Menu(item);??
this.addChild(menu);??
this.listener?=?cc.EventListener.create({??
event:?cc.EventListener.CUSTOM,//事件類型---自定義??
eventName:"event_custom_name",???//事件名稱??
????????????callback:?function?(event)?{??
cc.log("event?=?"+event.getUserData());??
????????????????event.getUserData().logHellow();??
????????????}??
????????});??
cc.eventManager.addListener(this.listener,1);??
????},??
????onclick:?function?()?{??
var?layer?=new?OtherLayer();??
var?event?=new?cc.EventCustom("event_custom_name");??
????????event.setUserData(layer);??
????????cc.eventManager.dispatchEvent(event);??
????}??
});??
var?OtherLayer?=?cc.LayerColor.extend({??
????ctor:?function?()?{??
this._super();??
????},??
????logHellow:?function(){??
cc.log("Hellow");??
????}??
});??
var?EventCustomScene?=?cc.Scene.extend({??
????ctor:?function?()?{??
this._super();??
var?layer?=new?EventCustomLayer();??
this.addChild(layer);??
????}??
})??
例子通過自定義事件把OtherLayer對(duì)象用event.setUserData傳遞到this.listener中然后用event.getUserData得到對(duì)象恨诱。并且調(diào)用對(duì)象中的方法
最后輸出:
第二種:可以攜帶多個(gè)參數(shù)的自定義事件
添加自定義事件:
[java]?view plain?copy
cc.eventManager.addCustomListener("event_custom_name",?function?(event)?{??
cc.log("hello");??
cc.log("b?=?"+?event.getUserData().b);??
????????????event.getUserData().a.logHellow()??
????????});??
派發(fā)事件:
[java]?view plain?copy
cc.eventManager.dispatchCustomEvent("event_custom_name",{a:new?OtherLayer(),b:"csdn"});??
第二個(gè)參數(shù)是用大括號(hào)括起來歇式、可以自定義個(gè)多個(gè)參數(shù),并且參數(shù)是可以是任意類型的值或者對(duì)象胡野。在接收事件的地方可以用event.getUserData().加參數(shù)名調(diào)用材失。如:event.getUserData().b
例子:
[java]?view plain?copy
var?EventCustomLayer?=?cc.LayerColor.extend({??
listener:null,??
????ctor:?function?()?{??
this._super();??
var?item?=new?cc.MenuItemFont("onclick",this.onclick);??
var?menu?=new?cc.Menu(item);??
this.addChild(menu);??
cc.eventManager.addCustomListener("event_custom_name",?function?(event)?{??
cc.log("hello");??
cc.log("b?=?"+?event.getUserData().b);??
????????????event.getUserData().a.logHellow()??
????????});??
????},??
????onclick:?function?()?{??
cc.eventManager.dispatchCustomEvent("event_custom_name",{a:new?OtherLayer(),b:"csdn"});??
????}??
});??
var?OtherLayer?=?cc.LayerColor.extend({??
????ctor:?function?()?{??
this._super();??
????},??
????logHellow:?function(){??
cc.log("Hello?World");??
????}??
});??
var?EventCustomScene?=?cc.Scene.extend({??
????ctor:?function?()?{??
this._super();??
var?layer?=new?EventCustomLayer();??
this.addChild(layer);??
????}??
})??
輸出的結(jié)果是:
刪除自定義事件:
移除所有監(jiān)聽者
removeCustomListeners(customEventName)
移除有同樣事件名字的所有自定義監(jiān)聽者
removeListener(listener)
移除一個(gè)監(jiān)聽者。
removeListeners(listenerType, recursive)
移除有相同事件監(jiān)聽者類型的所有監(jiān)聽者硫豆,或者一個(gè)節(jié)點(diǎn)的所有監(jiān)聽者
來源http://blog.csdn.net/a641832648/article/details/50832780