又踩坑了-全局消息派发机制

贴段文档
派送事件
上文提到了 dispatchEvent 方法,通过该方法发射的事件,会进入事件派送阶段。在 Cocos Creator 的事件派送系统中,我们采用冒泡派送的方式。冒泡派送会将事件从事件发起节点,不断地向上传递给他的父级节点,直到到达根节点或者在某个节点的响应函数中做了中断处理 event.stopPropagation()。

如上图所示,当我们从节点 c 发送事件 “foobar”,倘若节点 a,b 均做了 “foobar” 事件的监听,则 事件会经由 c 依次传递给 b,a 节点。如:
// 节点 c 的组件脚本中
this.node.dispatchEvent( new cc.Event.EventCustom(‘foobar’, true) );
敢问一句 你这个派发和emit有啥区别

接收消息xxx.on() 不在同一脚本永远收不到消息
EventCustom 竟然在sample里面只字未提
还是自己乖乖写个全局消息派发机制

给大家个传送门
http://forum.cocos.com/t/creator-1/40275

dispatchEvent才是真正的分发事件,如果用this.node.emit只是触发this.node上的指定 handler 函数(你用this.node.on注册的)。

1赞

其实真正开发要用的事件一定是全局派发全局监听来用的,这个理应官方做,但是无奈确实没找到全局事件,只能自己简单实现:

//全局事件
cc.director.GlobalEvent = {
    handles_: {},
    //发送事件
    emit: function (eventName, data) {
        var returns = [] //返回值

        data.eventName = eventName//保存一下事件名字

        for ( var findEvenName in this.handles_ ){
            if (findEvenName == eventName) {
                for (var i = 0; i < this.handles_[findEvenName].length; i++) {
                    var returnValue = this.handles_[findEvenName][i](data)
                    returns.push(returnValue)
                }
            }
        }

        return returns
    },
    //添加普通事件
    on: function (eventName, callback, target) {
        // console.log('收到事件', eventName);
        this.handles_[eventName] = this.handles_[eventName] || []

        this.handles_[eventName].push(callback.bind(target))
    },
    //通过事件名和target移除一个监听器
    off: function (eventName) {
        for (var i = 0; i < this.handles_[eventName].length; i++) {
            this.handles_[eventName][i] = null
        }
    },
}

1赞

cc.director.on
cc.director.emit

6赞

思路不错,试试

深夜给你鞠个躬,非常感谢,困惑了我一晚上的全局事件监听,官方的事件监听真心觉得,,,,你懂得!我就不说什么了!

我跟你这个类似,写一个继承自cc.EventTarget的类弄成单例直接来用,cc.Director也是继承自cc.EventTarget的。我很疑惑的是很多大佬都是自己写是为什么,而且写出来的也并没有扩展其它功能(例如事件的作用域),只是简单的on、emit、off

大部分人不知道EventTarget这个东西,属于是cocos-lua或其他的遗产再利用