关于1.6.1自定义事件

(function () {
    var NewEventCustom = {
        eventTarget: new cc.EventTarget()
    };
    //new cc.EventTarget();

    NewEventCustom.on = function (event_name, call_back, nodeOrProity) {
        if (typeof event_name === 'undefined' || typeof call_back === 'undefined') {
            cc.warn('EventCustom on: event_name or callback is null.');
            return;
        };

        if (!nodeOrProity) {
            nodeOrProity = cc.game;
        }

        if (nodeOrProity instanceof cc.Component) {
            nodeOrProity = nodeOrProity.node;
        }

        function onEnd(event) {
            call_back(event.detail, event);
        }

        if (nodeOrProity instanceof cc.Node) {
            this.off(event_name, nodeOrProity);
            nodeOrProity._eventCustom = nodeOrProity._eventCustom || {};
            nodeOrProity._eventCustom[event_name] = onEnd;
        }

        return this.eventTarget.on(event_name, onEnd, nodeOrProity, true);
    };

    NewEventCustom.once = function (event_name, call_back, nodeOrProity) {
        if (typeof event_name === 'undefined' || typeof call_back === 'undefined') {
            cc.warn('EventCustom once: event_name or callback is null.');
            return;
        };

        if (nodeOrProity instanceof cc.Component) {
            nodeOrProity = nodeOrProity.node;
        }

        var self = this;
        function onceFunc(event) {
            call_back(event.detail, event);
        };

        this.eventTarget.once(event_name, onceFunc, nodeOrProity, true);
    };

    //发送自定义事件
    //@param {string} event_name
    //@param {*} user_data
    NewEventCustom.emit = function (event_name, user_data) {
        if (typeof event_name === 'undefined') {
            cc.warn('EventCustom emit: event_name is null.');
            return;
        };
        cc.log("EventCustom.emit " + event_name);

        var event = new cc.Event.EventCustom(event_name);
        event.detail = user_data;

        // Event.AT_TARGET
        event.eventPhase = cc.Event.AT_TARGET;
        event.target = event.currentTarget = this.eventTarget;

        this.eventTarget.dispatchEvent(event);
    };

    //关闭自定义事件
    //@param {listener|string|Node|Component} eventNameOrNode
    //@param {null|node|Component} nodeOrComponent if eventNameOrNode is "string" need nodeOrComponent
    NewEventCustom.off = function (eventNameOrNode, nodeOrComponent) {
        if (eventNameOrNode instanceof cc.EventListener) {
            cc.eventManager.removeListener(eventNameOrNode);
        } else if (typeof eventNameOrNode === 'string') {
            if (nodeOrComponent) {
                //关闭某个节点上这个事件的监听
                if (nodeOrComponent instanceof cc.Component) {
                    nodeOrComponent = nodeOrComponent.node;
                }

                if (nodeOrComponent._eventCustom) {
                    var callback = nodeOrComponent._eventCustom[eventNameOrNode];
                    if (callback) {
                        delete nodeOrComponent._eventCustom[eventNameOrNode];
                        this.eventTarget.off(eventNameOrNode, callback, nodeOrComponent, true);
                    }
                } else {
                    this.eventTarget.off(eventNameOrNode);
                }
            }
        } else if (eventNameOrNode instanceof cc.Node) {
            this.eventTarget.targetOff(eventNameOrNode);
        } else if (eventNameOrNode instanceof cc.Component) {
            cc.eventManager.targetOff(eventNameOrNode.node);
        }
    };


    module.exports = NewEventCustom;
})();

以上为我自定义事件脚本,
然后在项目中多处(不同节点,不同脚本)做事件监听,例如:
EventCustom.on(“event_name”, function () {
this.myFunc();
}.bind(this), this.node);
某个条件下触发一次事件发送
EventCustom.emit(“event_name”);

运行结果:
只有一处监听生效,且执行了两次this.myFunc();

所以想问下,这个自定义事件官方能不能给个详细的案例,或者这个是个bug.

NewEventCustom 可以忽略这个命名
因为脚本命是 EventCustom.js

别沉哦

好焦虑

就没人自定义事件的吗?

这不是你自己写的代码吗?自己写的东西别人帮你查没有你自己查那么快吧?

自己写的代码没问题,我问的在于事件作多处监听为什么只在一处生效,且还执行了2次,并且在1.2.2引擎运行是完全无问题的

顺便说下,这个问题是在将项目从1.2.2升级到1.6.1后产生的。所以代码是没什么问题的。我就想知道官方改了什么

事件系统这块好像官方改的比较多

最好给一下 demo,相关人员才能进行跟进,感谢

直接用我这个js 脚本就可以了,用法就是:
模拟一下事件发送EventCustom.emit(“event_name”);
然后在多个节点上去作监听
EventCustom.on(“event_name”, function () {
this.myFunc();
}.bind(this), this.node);

你这些说了某些条件,所以不知道你是用什么方式操作的,有时候一个 demo 真的能解决很多时间上的问题,不需要在反复的问,(可以省你我很多时间的)

demo_custom_event.zip (542.1 KB)

十分感谢,会立即让相关人员测试,尽快回复

刚刚调试了一下你的代码,是因为在注册 on 的时候,使用了 off ,导致注册 第二个事件的时候把第一个事件 off 掉了,之前的 1.2 成功应该是没 off 成功(你可能还要在理一下你的逻辑)

同名事件如果传了cc.Node进去,自己把之前的事件关闭监听了,把代码注释了就好了,不知道你这样做的意图是什么

明白了

确实是我自己的问题