CocosCreatorメッセージ配信メカニズムの詳細な説明

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要

この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス層では、分離する必要があるすべてのシステムとモジュール間の通信を、メッセージ配信を通じて分離できます。たとえば、ネットワーク復帰通知、インターフェースに同期されたデータ更新など。

メッセージ配信はオブザーバー パターンに基づいて設計されています。メッセージを処理する必要がある場所では、リスニング コールバックをメッセージ センターに登録します。メッセージがディスパッチされると、メッセージ センターのディスパッチ インターフェイスが呼び出され、メッセージのリスニング キューを走査して、対応するコールバック メソッドを呼び出します。

具体的な計画

まずリスニングコールバックタイプを定義する

/**
 * メッセージ監視コールバックメソッド */
エクスポート型NotifyListener = (src: any, data: any) => void;

キー値でリスニングキューを保存する

プライベート静的 msg2listDict: Dictionary< 文字列、配列<NotifyListenerInfo> > = 新しい Dictionary< 文字列、配列<NotifyListenerInfo> >();

インターフェース定義

/**
 * 複数のリスナーを追加します。手動で削除する必要があります * @param msg
 * @param リスナー
 * @param ターゲット
 */
パブリック静的 addListener(メッセージ: 文字列、リスナー: NotificationListener、ターゲット?: 任意): void {}
 
/**
 * ワンタイムリスナーを追加し、イベントがトリガーされた後に削除します* @param msg
 * @param リスナー
 * @param ターゲット
 */
パブリック静的 addOnceListener(メッセージ: 文字列、リスナー: NotificationListener、ターゲット?: 任意): void {}
 
/**
 * 指定されたメッセージで指定されたリスナーを削除します * @param msg
 * @param リスナー
 */
パブリック静的removeMsgListener(メッセージ: 文字列、リスナー: NotificationListener): void {}
 
/**
 * 指定されたメッセージのすべてのリスナーを削除します * @param msg
 */
パブリック静的removeMsgAllListeners(msg: string): void {}
 
/**
 * 指定されたターゲットの指定されたメッセージの監視を削除します * @param msg
 * @param ターゲット
 */
パブリック静的removeTargetMsgListen(メッセージ: 文字列、ターゲット: 任意): void {}
 
/**
 * 指定されたターゲットのすべてのメッセージリスナーを削除します * @param target
 */
パブリック静的removeTargetAllMsgListen(ターゲット: 任意): void {}
 
/**
 * メッセージを送信 * @param msg
 * @param ソース
 * @param データ
 */
パブリック静的通知(メッセージ: 文字列、ソース: 任意、データ: 任意): void {}

追加および削除の実装では、メッセージが送信される可能性があることに注意する必要があります。

新しく追加されたメッセージのリスナーは、現在のキューのメッセージが配信された後に配信される必要があります。そのため、追加するキューを追加します。

プライベート静的リスナー2add: Array<NotifyListenerInfo> = [];

リスナーを追加する際には以下の判断を行ってください

// メッセージはディスパッチされ、キューに追加されます if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {
    NotificationCenter.listener2add.push(情報);
    戻る;
}

同様に、リスナーを削除するときにも、メッセージがディスパッチされる可能性があります。キューの変更によって for ループ例外が発生するのを回避するには、削除するキューを追加します。メッセージをディスパッチするときに、リスナーが削除キュー内にある場合は、ディスパッチされません。メッセージが送信されたら、キューから削除します

プライベート静的リスナー2削除: Array<NotifyListenerInfo> = [];

リスナーを削除する際には、次の判断を行う

// メッセージは送信され、削除されるキューに入れられます if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {
    NotificationCenter.listener2remove.push(リスト[i]);
} それ以外 {
    リスト.splice(i, 1);
}

メッセージをディスパッチするときに、指定されたメッセージのキューを反復処理します。

// キューが存在しないため、処理する必要はありません。let list = NotificationCenter.msg2listDict.get(msg);
if (!リスト) {
    戻る;
}
 
// メッセージをディスパッチ済みとしてマークします。複数のメッセージが同時にディスパッチされる場合があります。同じメッセージが複数回マークされる場合があります。NotifyCenter.notifyMsgs.push(msg);
 
// メッセージディスパッチを処理する for (let i = 0, n = list.length; i < n; i++) {
    NotificationCenter._dispatch(リスト[i]、src、データ、false);
}

メッセージを送信する際、まずキューが削除されるかどうかを確認します。

// 削除キューではディスパッチなし if (NotifyCenter.listener2remove.indexOf(info) >= 0) {
    戻る;
}

現在のキューがディスパッチされた後、追加するキューをチェックします

// 追加するキューを処理する for (let i = 0, n = msg2add.length; i < n; i++) {
    リスナー2追加[i].msg == msgの場合{
        NotificationCenter._dispatch(listener2add[i], src, data, true);
    }
}

メッセージ配信センターが導入され、分離されたシステムとモジュールがメッセージの監視とディスパッチを通じて通信し、相互参照の結合を回避できるようになります。

以上がCocosCreatorメッセージ配信の仕組みの詳しい説明です。CocosCreatorメッセージ配信の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • vue.js で JSZip を使用してフロントエンドでファイルを解凍する方法
  • CocosCreator ソースコードの解釈: エンジンの起動とメインループ
  • CocosCreator 一般的なフレームワーク設計リソース管理
  • CocosCreatorでリストを作成する方法
  • CocosCreator の新しいリソース管理システムの分析
  • CocosCreator スケルトンアニメーション ドラゴンボーン
  • CocosCreatorでクールなレーダーチャートを描く方法
  • CocosCreator MVCアーキテクチャの詳細な説明
  • CocosCreatorでJSZip圧縮を使用する方法

<<:  in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明

>>:  Centos7 サーバーで jar パッケージ プロジェクトを開始する最良の方法

推薦する

リモートログインとポート公開を防ぐためのLinuxサーバー構成IPホワイトリスト

序文ブロガーが使用しているサーバーは Alibaba Cloud から購入したものです。実際、Ali...

シンプルなHTMLとCSSの使い方の詳細な説明

HTML と CSS を含む JD.com のホームページの静的ページ効果を 3 日間で完成させます...

ウェブデザイナーが注意すべき 43 のウェブデザインの間違い

これはウェブサイトのユーザビリティに関する記事です。著者は自身の経験に基づいて、ウェブサイトのデザイ...

CentOS 7 で grub パスワードと単一ユーザー ログインを設定するサンプル コード

Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...

Centos6.5 でのスーパーバイザーのアップグレード、インストール、および構成に関するチュートリアル

スーパーバイザー紹介Supervisor は、Python で開発されたクライアント/サーバー サー...

JavaScript 配列の Reduce() メソッドの構文と例の分析

序文Reduce() メソッドは関数を累積器として受け取り、配列内の各値 (左から右へ) が単一の値...

Linuxグループの基礎知識ポイントまとめ

1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...

レスポンシブなアコーディオン効果を実現するための CSS3 の詳細な説明

最近、外国人が CSS3 を使用してアコーディオン効果を実現しているビデオを見たので、自分で学習した...

JavaScript が Taobao の虫眼鏡効果を模倣

この記事では、淘宝虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

Node.js での SerialPort モジュールの使用

目次目的モジュールのインストール基本的な使い方ポートをスキャンする開いているポートデータの送信データ...

CSS3 で虫眼鏡効果を模倣するいくつかの方法の原理の分析

記事のタイトルが「模造虫眼鏡」なのはなぜですか?今日お話ししたいのは、一般的に言われているような、マ...

Nginx ロードバランシング クラスタの実装

(1)実験環境youxi1 192.168.5.101 ロードバランサーyouxi2 192.168...

Vueのprops設定の詳細な説明

<テンプレート> <div class="demo">...

JavaScript はクラス宝くじアプレットを実装します

この記事では、クラス抽選アプレットを実装するためのJavaScriptの具体的なコードを参考までに紹...

Webpack でよく使われる 12 個の Loader を共有する (要約)

目次序文スタイルローダーCSSローダーsassローダーpostcssローダーバベルローダーtsローダ...