CocosCreator消息分发是什么样的,如何理解
Admin 2022-10-28 群英技术资讯 1061 次浏览
这篇文章主要介绍“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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于javascript的相关知识,主要介绍了JavaScript中异步与回调的基本概念,以及回调地狱现象,本文主要介绍了异步和回调的基本概念,二者是JavaScript的核心内容,下面一起来看依稀啊,希望对大家有帮助。
每次路由发生变化时都需要调用一次路由守卫,并且store中的数据会在每次刷新的时候清空,因此需要判断store中是否有添加的动态路由,本文给大家分享vue中根据用户权限动态添加路由的问题,感兴趣的朋友一起看看吧
面向对象语言中 this 表示当前对象的一个引用。但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变,在方法中,this 表示该方法所属的对象,如果单独使用,this 表示全局对象
这篇文章主要为大家详细介绍了小程序实现文字循环滚动动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
最近因为基础设施调整,需要进行harbor镜像仓库的迁移,主要是旧版本很老了,不想使用,直接打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间版本过度进行迁移,但是需要测试,好多功能,而且配置有点费事,尽管官方提供了升级说明,但是没敢用,就怕出故障restapi请求流程还好harbor提供了restapi,还算比较全,proj
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008