cocos2d-js的自定義事件的兩種創建方法

自定義事件是當其它事件不滿足用戶的時候可以自己定義。像傳遞值或者對象。

我們都知道創建一個監聽器無非就是兩個步驟:一是創建Listener,二是添加到eventManage上。但是EventCustom多了一個需要自己調度

dispatchCustomEvent或者dispatchEvent.

第一種方法:

首先是創建自定義Listener:

this.listener = cc.EventListener.create({
            event: cc.EventListener.CUSTOM,   //事件類型---自定義
            eventName: "event_custom_name",   //事件名稱
            callback: function (event) {
                cc.log("event = "+event.getUserData());
            }
        });
然後是添加到eventManage上:

cc.eventManager.addListener(this.listener,1);
官方文檔是對後面那個1說是自定義事件時候的固定優先級

最後是派發,也就是調用

 var event = new cc.EventCustom("event_custom_name");
 event.setUserData("123");
 cc.eventManager.dispatchEvent(event);

實例:

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對象用event.setUserData傳遞到this.listener中然後用event.getUserData得到對象。並且調用對象中的方法
最後輸出:




第二種:可以攜帶多個參數的自定義事件

添加自定義事件:

cc.eventManager.addCustomListener("event_custom_name", function (event) {
            cc.log("hello");
            cc.log("b = "+ event.getUserData().b);
            event.getUserData().a.logHellow()
        });

派發事件:

cc.eventManager.dispatchCustomEvent("event_custom_name",{a:new OtherLayer(),b:"csdn"});
第二個參數是用大括號括起來、可以自定義個多個參數,並且參數是可以是任意類型的值或者對象。在接收事件的地方可以用event.getUserData().加參數名調用。如:event.getUserData().b

例子:

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);
    }
})

輸出的結果是:

刪除自定義事件:

移除所有監聽者
removeCustomListeners(customEventName)
移除有同樣事件名字的所有自定義監聽者
removeListener(listener)
移除一個監聽者。
removeListeners(listenerType, recursive)
移除有相同事件監聽者類型的所有監聽者,或者一個節點的所有監聽者



發佈了34 篇原創文章 · 獲贊 30 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章