creator全局事件

this.node.emit只能监听同一个节点的事件,请问怎么可以实现监听其它节点发出的事件,也就是全局事件?

1赞
var NOTIFICATION = (function (){
    var eventList = {};
    function on(type, callback, target) {
        if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'on' param error!");
            return;
        }
        if (typeof eventList[type] === "undefined") {
            eventList[type] = [];
        }
        eventList[type].push({callback: callback, target: target});
    }

    function once(type, callback, target) {
        if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'on' param error!");
            return;
        }
        if (typeof eventList[type] === "undefined") {
            eventList[type] = [];
        }
        eventList[type].push({callback: callback, target: target, once: true});
    }

    function emit(type, data) {
        if (typeof type !== "string") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'emit' param error!");
            return;
        }
        var list = eventList[type];
        if (typeof list !== "undefined") {
            for (var i = 0; i < list.length; i++) {
                var event = list[i];
                if (event) {
                    event.callback.call(event.target, data);
                    if(event.once){
                        off(type, event.callback, event.target);
                    }
                }
            }
        }
    }

    function off(type, callback, target) {
        if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'off' param error!");
            return;
        }
        var list = eventList[type];
        if (typeof list !== "undefined") {
            for (var i = 0; i < list.length; i++) {
                var event = list[i];
                if (event && event.callback === callback && event.target === target) {
                    list.splice(i, 1);
                    break;
                }
            }
        }
    }

    function offByType(type) {
        if (typeof type !== "string") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'offByType' param error!");
            return;
        }
        while (eventList[type].length > 1) {
            eventList[type].shift();
        }
        eventList[type] = undefined;
    }

    function offByTarget(target){
        if (typeof target === "undefined") {
            cc.error("GLOBAL_DEF.js: NOTIFICATION method 'offByTarget' param error!");
            return;
        }
        for(var key in eventList){
            for(var i = 0; i < eventList[key].length ; i++){
                if(eventList[key][i].target === target){
                    eventList[key].splice(i, 1);
                    cc.log('off ' + key);
                    break;
                }
            }
        }
    }
    return {on: on, once: once, emit: emit, off: off, offByType: offByType, offByTarget: offByTarget};
})();

修改自 @1111020

3赞

谢谢!

忘了说了,NOTIFICATION要放到插件脚本或者window上,这样才能全局监听和发射

所有节点统一在同一个全局对象上触发和监听事件即可
这个全局对象可以是全局节点,也可以是 window.globalEvent = new cc.EventTarget();

EventTarget 中 emit 函数的第二个参数无论传什么,在 on 监听的回调里,event.detail 都是undefined,难道数据不是这样传递的?

试试

event.getUserData()

event 对象不可持有,只能收到事件的当帧立刻获取里面的信息

厉害的我的哥,获取到数据了,文档上完全没有,完全猜不出来用法。。

event.getUserData(),原来是这样用

好像只有emit发射的事件才能用event.detail

我是用emit发射的,但是 event.detail 是undefined,event.getUserData()就可以获取

我不知道该说什么

EventCustom.prototype.getUserData = function () {
    return this.detail;
};

为什么不用cc.systemEvent.on呢?这不就是全局事件吗?

这是 systemEvent,业务逻辑和系统逻辑混在一起不太好

能给一个完整 的范例吗?
a.js设置全局事件
b.js监听全局事件的

自定义的消息如何全局, 有没有监听和发射的例子?

可以用 eventproxy 功能强大

globalEvent.on(“shit”, function (event) { console.log(“eat”, event.detail); });

globalEvent.emit(“shit”, “see you tomorrow”);

输出
eat see you tomorrow

1赞

sendCardText : function(sp,node,CardText){
//传递事件
cc.find(‘ImageMyCard’).emit(“CardName”,
{CardText:CardText},
);
cc.testEvent= new cc.Event.EventCustom(“CardName”, false);
cc.testEvent.setUserData(CardText);
},
触摸精灵结束后触发,两个不同的节点,这是节点A,怎么发射。好迷茫。