这篇文章将为大家详细讲解有关CocosCreator消息分发机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述本篇开始介绍游戏业务架构相关的内容。在游戏业务层,所有需要隔离的系统和模块间通信
这篇文章将为大家详细讲解有关CocosCreator消息分发机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
本篇开始介绍游戏业务架构相关的内容。在游戏业务层,所有需要隔离的系统和模块间通信都可以通过消息分发解耦。例如网络返回通知、数据更新同步到界面等。
消息分发基于观察者模式设计。需要处理消息的地方向消息中心注册监听回调,派发消息时,调用消息中心的派发接口遍历该消息的监听队列,调用对应的回调方法。
先定义监听回调类型
export type NotifyListener = (src: any, data: any) => void;
通过key-value方式保存监听队列
private static msg2listDict: Dictionary< string, Array<NotifyListenerInfo> > = new Dictionary< string, Array<NotifyListenerInfo> >();
接口定义
public static addListener(msg: string, listener: NotifyListener, target?: any): void {} public static addOnceListener(msg: string, listener: NotifyListener, target?: any): void {} public static removeMsgListener(msg: string, listener: NotifyListener): void {} public static removeMsgAllListeners(msg: string): void {} public static removeTargetMsgListen(msg: string, target: any): void {} public static removeTargetAllMsgListen(target: any): void {} 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消息分发机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
--结束END--
本文标题: CocosCreator消息分发机制的示例分析
本文链接: https://www.lsjlt.com/news/271104.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
2024-05-08
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0