简单的CocosCreator自定义全局事件

2019-05-08  本文已影响0人  zzqlb

creator 中的事件:监听和发射事件
但是这样并不能完全满足我们的需求,我们通常希望在各个地方自由的派发事件,同时所有的监听都能收到派发出来的事件,
所以实现了个EventCenter,简单的实现了功能。记录一下:
代码:

window.EventCenter = {

    _events: {},

    EventType : {
        TEST_EVENT: "TEST_EVENT",
    },

    AddListener : function(eventname,callback,target){
        if(this._events[eventname] == undefined)
        {
            this._events[eventname] = [];
        }
        this._events[eventname].push({
            callback: callback,
            target: target,
        });
    },

    RemoveListener : function(eventname,callback,target){
        var handlers = this._events[eventname];
        for (var index = handlers.length - 1; index >= 0; index--) {
            var handler = handlers[index];
            if(target == handler.target && callback.toString() == handler.callback.toString())
            {
                this._events[eventname].splice(index, 1);
            };
        }
    },

    RemoveAllListener : function(eventname) {
        if(this._events[eventname] != undefined)
        {
            var handlers = this._events[eventname];
            for (var index = 0; index < handlers.length; index++) {
                handlers[index] = null;
            }
        }
    },

    ResetAllListener : function() {
        for (const key in this._events) {
            if (this._events.hasOwnProperty(key)) {
                delete this._events[key]; 
            }
        }
    },
    
    dispatchEvent : function(eventname,data){
        if(this._events[eventname] != undefined)
        {
            var handlers = this._events[eventname];
            for (var index = 0; index < handlers.length; index++) {
                var handler = handlers[index];
                handler.callback.call(handler.target,data);
            }
        }
    },
}

调用:

//注册事件
EventCenter.AddListener(EventCenter.EventType.TEST_EVENT,this.TestCallBack,this);
TestCallBack: function(data){
        cc.log("data : "data.data);
    },

//一定要记得移除事件
EventCenter.RemoveListener(EventCenter.EventType.TEST_EVENT,this.GainFallBallCallBack,this);

//派发事件,第二个参数可以是需要传递的数据
EventCenter.dispatchEvent(EventCenter.EventType.TEST_EVENT);
EventCenter.dispatchEvent(EventCenter.EventType.TEST_EVENT,{“data”:"data"});
上一篇 下一篇

猜你喜欢

热点阅读