91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CocosCreator消息分發機制的示例分析

發布時間:2021-04-16 10:56:35 來源:億速云 閱讀:222 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關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);
    }
}

關于“CocosCreator消息分發機制的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

政和县| 古田县| 蓝田县| 湖北省| 额济纳旗| 察雅县| 全椒县| 波密县| 枣阳市| 江油市| 彩票| 偏关县| 绥化市| 惠安县| 东平县| 龙州县| 驻马店市| 仙桃市| 乐平市| 南京市| 辽阳市| 澳门| 班戈县| 剑河县| 新密市| 凤阳县| 乌兰浩特市| 苏尼特左旗| 桦南县| 平山县| 新宁县| 陈巴尔虎旗| 壤塘县| 惠安县| 冕宁县| 高平市| 田林县| 滦南县| 九台市| 海门市| 巴塘县|