CocosCreator事件定义

版权声明:本文为博主原创文章,转载注明来源。 https://blog.csdn.net/u013654125/article/details/81567278

以下是根据CocosCreator接口做的—全局事情管理类。

/**
    全局事件管理类,主要是在各个脚本之间发送消息
    以下的test可以为公司名
*/

window.test = window.test || {};
(function() {
    var EventCtrl = {};

    //发送没有数据的事件
    EventCtrl.sendNormalEvent = function(eventType) {
        var event = new cc.Event.EventCustom(eventType);
        cc.director.dispatchEvent(event);
    }

    //发送有数据的事件
    EventCtrl.sendDataEvent = function(eventType, detail) {
        var event = new cc.Event.EventCustom(eventType);
        event.setUserData(detail);
        cc.director.dispatchEvent(event);
    }

    window.test.EventCtrl = EventCtrl;
})();

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

上面只是一个普通的事件管理类,下面,我们可以来一个进阶版—自定义CocosCreator事件的原码:

现在需求是这样,我们可能一个事件很多类都监听,这样发一次事件,就可能造成卡顿,我们需要每个监听类执行的时候有一个缓冲的过程(即每帧执行一个事件),这样我们需要做的是重定义callback-invoker.js里的invoke方法,

引擎原代码是这样的:

/**
 * @method invoke
 * @param {String} key
 * @param {any} [p1]
 * @param {any} [p2]
 * @param {any} [p3]
 * @param {any} [p4]
 * @param {any} [p5]
 */
CallbacksInvoker.prototype.invoke = function (key, p1, p2, p3, p4, p5) {
    var list = this._callbackTable[key];
    if (list) {
        var rootInvoker = !list.isInvoking;
        list.isInvoking = true;

        var callbacks = list.callbacks;
        var targets = list.targets;
        for (var i = 0, len = callbacks.length; i < len; ++i) {
            var callback = callbacks[i];
            if (callback) {
                var target = targets[i];
                if (target) {
                    callback.call(target, p1, p2, p3, p4, p5);
                }
                else {
                    callback(p1, p2, p3, p4, p5);
                }
            }
        }

        if (rootInvoker) {
            list.isInvoking = false;
            if (list.containCanceled) {
                list.purgeCanceled();
            }
        }
    }
};

然后,我们需要修改成:

/**
 * @method invoke
 * @param {String} key
 * @param {any} [p1]
 * @param {any} [p2]
 * @param {any} [p3]
 * @param {any} [p4]
 * @param {any} [p5]
 */
CallbacksInvoker.prototype.invoke = function (key, p1, p2, p3, p4, p5) {
    var list = this._callbackTable[key];
    if (list) {
        var rootInvoker = !list.isInvoking;
        list.isInvoking = true;

        var callbacks = list.callbacks;
        var targets = list.targets;
        for (let i = 0, len = callbacks.length; i < len; ++i) {
            let callback = callbacks[i];
            if (callback) {
                let target = targets[i];
                if (target) {
                    setTimeout(function() {
                        callback.call(target, p1, p2, p3, p4, p5);
                    }, i*60);
                }
                else {
                    setTimeout(function() {
                        callback.call(p1, p2, p3, p4, p5);
                    }, i*60);
                }
            }
        }

        if (rootInvoker) {
            list.isInvoking = false;
            if (list.containCanceled) {
                list.purgeCanceled();
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/u013654125/article/details/81567278