cocos creator MVC 设计之事件分发
重点
- 需求:凡是订阅了这个事件的关注点,一旦发生这个事情,就会通知到对应的接收地方
- 事件的核心使用操作
- api的编写
需求
当游戏发生一个事件,这个事件可能和多个应用有监听,这个监听有对应的模块,一旦有这个事件发生,我们需要所有监听的这个模块都能得到对应的反应,比如捕鱼达人,打死鱼以后我们需要得到更新这个鱼对应的金币,这样我们就可以利用这个设计进行操作。
已下分为三个模块:
- 事件的派发者
- 事件的管理者
- 事件的接听者
api的设计
核心设计
事件的监听
add_event_listenner api设计
/**
event_name 事件的名字
caller 那个需要监听
func 返回函数
*/
add_event_listenner(event_name, caller, func) {
//其中this.events_map 是一个表结构
if (!this.events_map[event_name]) {
this.events_map[event_name] = [];
}
//事件名的返回函数想对应
var event_queue = this.events_map[event_name];
event_queue.push({
caller: caller,
func: func
});
},
删除事件remove_event_listenner
remove_event_listenner(event_name, caller, func) {
//判断是否有对应的事件在集合里面
if (!this.events_map[event_name]) {
return;
}
//如果有的话就删除对应的事件
var event_queue = this.events_map[event_name];
for(var i = 0; i < event_queue.length; i ++) {
var obj = event_queue[i];
if (obj.caller == caller && obj.func == func) {
event_queue.splice(i, 1);
break;
}
}
//如果事件完全被删除这个立标就为空
if (event_queue.length <= 0) {
this.events_map[event_name] = null;
}
},
派发事件
dispatch_event(event_name, udata) {
if (!this.events_map[event_name]) {
return;
}
var event_queue = this.events_map[event_name];
for(var i = 0; i < event_queue.length; i ++) {
var obj = event_queue[i];
obj.func.call(obj.caller, event_name, udata);
}
},
javascript基础教程