以下是根据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();
}
}
}
};