一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 詳解CocosCreator消息分發機制

詳解CocosCreator消息分發機制

2022-03-03 16:50houjia159 js教程

這篇文章主要介紹了詳解CocosCreator消息分發機制,詳細介紹了各模塊的設計,同學們一定要自己看下

概述

本篇開始介紹游戲業務架構相關的內容。在游戲業務層,所有需要隔離的系統和模塊間通信都可以通過消息分發解耦。例如網絡返回通知、數據更新同步到界面等。

消息分發基于觀察者模式設計。需要處理消息的地方向消息中心注冊監聽回調,派發消息時,調用消息中心的派發接口遍歷該消息的監聽隊列,調用對應的回調方法。

具體方案

先定義監聽回調類型

?
1
2
3
4
/**
 * 消息監聽回調方法
 */
export type NotifyListener = (src: any, data: any) => void;

通過key-value方式保存監聽隊列

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

接口定義

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
 * 添加多次監聽者,需要手動移除
 * @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 {}

在添加移除實現中,需要注意某消息可能正在派發。

對于一個消息新添加的監聽者,應該在當前隊列消息派發完后再派發,因此,添加一個待添加隊列

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

在添加監聽者時做以下判斷

?
1
2
3
4
5
// 該消息正在派發,放入待添加隊列
if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {
    NotifyCenter.listener2add.push(info);
    return;
}

同樣在移除監聽者時,可能正在派發消息,避免對隊列的修改導致for循環異常,添加一個待移除隊列,派發消息時,如果該監聽者在移除隊列則不派發。在消息派發完后再將其移出隊列

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

在移除監聽者時做以下判斷

?
1
2
3
4
5
6
// 該消息正在派發,放入待移除隊列
if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {
    NotifyCenter.listener2remove.push(list[i]);
} else {
    list.splice(i, 1);
}

派發消息時遍歷指定消息下的隊列

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 隊列不存在,不需要處理
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);
}

派發消息時先判斷是否在移除隊列

?
1
2
3
4
// 在移除隊列,不派發
if (NotifyCenter.listener2remove.indexOf(info) >= 0) {
    return;
}

當前隊列派發完后檢查待添加隊列

?
1
2
3
4
5
6
// 處理待添加隊列派發
for (let i = 0, n = msg2add.length; i < n; i++) {
    if (listener2add[i].msg == msg) {
        NotifyCenter._dispatch(listener2add[i], src, data, true);
    }
}

引入消息分發中心,隔離的系統、模塊間通過消息監聽和派發通信,避免互相引用耦合。

以上就是詳解CocosCreator消息分發機制的詳細內容,更多關于CocosCreator消息分發的資料請關注服務器之家其它相關文章!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉tv亚洲专区在线观看 | 亚洲精品在线看 | chinese壮直男gay老年人 | 国产精品欧美亚洲韩国日本 | www.青青操| 日韩欧美综合在线二区三区 | 娇喘高潮教室h | 99视频久久精品久久 | 青青青青青国产免费手机看视频 | 98成人| 国产福利微拍精品一区二区 | 99久久香蕉国产线看观香 | 亚洲国产精品综合一区在线 | 双性肉文高h | 丰满岳乱妇在线观看视频国产 | 欧美日韩精品一区二区三区高清视频 | 无人在线高清免费看 | 日韩在线观看网站 | 60岁了天天要小伙子 | yellow片在线观看 | 久99久热只有精品国产99 | 手机在线免费观看高清 | 日本精品一二三区 | 91一区二区在线观看精品 | 欧美日韩一二三区免费视频观看 | 国产精品自产拍在线观看2019 | 亚洲春色综合另类网蜜桃 | 网红思瑞一区二区三区 | 国产嫩草视频 | 校花小雪灌满了男人们的浓浆 | 国产成人久久精品推最新 | 男人天堂网www| 日韩一区在线观看 | 99re热这里只有精品 | 欧美日韩一区二区三区在线播放 | 十大免费批日的软件 | 69一级毛片 | 欧美日韩不卡视频 | 我被男人下药添得好爽 | 免费高清资源黄网站在线观看 | 歪歪视频在线播放无遮挡 |