CocosCreator消息分发是什么样的,如何理解

Admin 2022-10-28 群英技术资讯 325 次浏览

这篇文章主要介绍“CocosCreator消息分发是什么样的,如何理解”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CocosCreator消息分发是什么样的,如何理解”文章能帮助大家解决问题。


概述

本篇开始介绍游戏业务架构相关的内容。在游戏业务层,所有需要隔离的系统和模块间通信都可以通过消息分发解耦。例如网络返回通知、数据更新同步到界面等。

消息分发基于观察者模式设计。需要处理消息的地方向消息中心注册监听回调,派发消息时,调用消息中心的派发接口遍历该消息的监听队列,调用对应的回调方法。

具体方案

先定义监听回调类型

?
/**   * 消息监听回调方法   */ export type NotifyListener = (src: any, data: any) => void;

通过key-value方式保存监听队列

?
  private static msg2listDict: Dictionary< string, Array<NotifyListenerInfo> > = new Dictionary< string, Array<NotifyListenerInfo> >();

接口定义

?
/**   * 添加多次监听者,需要手动移除   * @param msg   * @param listener   * @param target   */ public static addListener(msg: string, listener: NotifyListener, target?: any): void {}   /**   * 添加单次监听者,事件触发后即移除   * @param msg   * @param listener   * @param target   */ public static addOnceListener(msg: string, listener: NotifyListener, target?: any): void {}   /**   * 移除指定消息指定的监听者   * @param msg   * @param listener   */ public static removeMsgListener(msg: string, listener: NotifyListener): void {}   /**   * 移除指定消息所有监听者   * @param msg   */ public static removeMsgAllListeners(msg: string): void {}   /**   * 移除指定目标对指定消息的监听   * @param msg   * @param target   */ public static removeTargetMsgListen(msg: string, target: any): void {}   /**   * 移除指定目标所有消息监听   * @param target   */ public static removeTargetAllMsgListen(target: any): void {}   /**   * 派发消息   * @param msg   * @param src   * @param data   */ public static notify(msg: string, src: any, data: any): void {}

在添加移除实现中,需要注意某消息可能正在派发。

对于一个消息新添加的监听者,应该在当前队列消息派发完后再派发,因此,添加一个待添加队列

?
private static listener2add: Array<NotifyListenerInfo> = [];

在添加监听者时做以下判断

?
// 该消息正在派发,放入待添加队列 if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {      NotifyCenter.listener2add.push(info);      return ; }

同样在移除监听者时,可能正在派发消息,避免对队列的修改导致for循环异常,添加一个待移除队列,派发消息时,如果该监听者在移除队列则不派发。在消息派发完后再将其移出队列

?
private static listener2remove: Array<NotifyListenerInfo> = [];

在移除监听者时做以下判断

?
// 该消息正在派发,放入待移除队列 if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {      NotifyCenter.listener2remove.push(list[i]); } else {      list.splice(i, 1); }

派发消息时遍历指定消息下的队列

?
// 队列不存在,不需要处理 let list = NotifyCenter.msg2listDict.get(msg); if (!list) {      return ; }   // 标记消息正在派发,多个消息可能同时在派发,同一消息可能标记多次 NotifyCenter.notifyMsgs.push(msg);   // 处理消息派发 for (let i = 0, n = list.length; i < n; i++) {      NotifyCenter._dispatch(list[i], src, data, false ); }

派发消息时先判断是否在移除队列

?
// 在移除队列,不派发 if (NotifyCenter.listener2remove.indexOf(info) >= 0) {      return ; }

当前队列派发完后检查待添加队列

?
// 处理待添加队列派发 for (let i = 0, n = msg2add.length; i < n; i++) {      if (listener2add[i].msg == msg) {          NotifyCenter._dispatch(listener2add[i], src, data, true );      } }

引入消息分发中心,隔离的系统、模块间通过消息监听和派发通信,避免互相引用耦合。

原文链接:https://blog.csdn.net/houjia159/article/details/108450241


关于“CocosCreator消息分发是什么样的,如何理解”就介绍到这了,如果大家觉得不错可以参考了解看看,如果想要了解更多,欢迎关注群英网络,小编每天都会为大家更新不同的知识。 群英智防CDN,智能加速解决方案
标签: Cocos消息分发

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服