详解CocosCreator消息分发机制


Posted in Javascript onApril 16, 2021

概述

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

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

具体方案

先定义监听回调类型

/**
 * 消息监听回调方法
 */
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);
    }
}

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

以上就是详解CocosCreator消息分发机制的详细内容,更多关于CocosCreator消息分发的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JS简单实现元素复制示例附图
Nov 19 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
Dec 15 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
Aug 01 Javascript
微信小程序 animation API详解及实例代码
Oct 08 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
Jun 03 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
Jul 12 Javascript
CocosCreator入门教程之网络通信
Apr 16 #Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
You might like
十天学会php(2)
2006/10/09 PHP
浅谈php命令行用法
2015/02/04 PHP
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
JS使用H5实现图片预览功能
2019/09/30 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
python实现智能语音天气预报
2019/12/02 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
python正则表达式实例代码
2020/03/03 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
水务局局长岗位职责
2013/11/28 职场文书
九年级数学教学反思
2014/02/02 职场文书
活动总结格式范文
2014/04/26 职场文书
安全生产宣传标语
2014/06/06 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书