小熊1986

导航

cocos creator MVC 设计之事件分发

重点

  • 需求:凡是订阅了这个事件的关注点,一旦发生这个事情,就会通知到对应的接收地方
  • 事件的核心使用操作
  • api的编写

需求

当游戏发生一个事件,这个事件可能和多个应用有监听,这个监听有对应的模块,一旦有这个事件发生,我们需要所有监听的这个模块都能得到对应的反应,比如捕鱼达人,打死鱼以后我们需要得到更新这个鱼对应的金币,这样我们就可以利用这个设计进行操作。

已下分为三个模块:

  1. 事件的派发者
  2. 事件的管理者
  3. 事件的接听者

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);
    }
},

posted on 2021-05-04 16:24  小熊1986  阅读(196)  评论(0编辑  收藏  举报