概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス層では、分離する必要があるすべてのシステムとモジュール間の通信を、メッセージ配信を通じて分離できます。たとえば、ネットワーク復帰通知、インターフェースに同期されたデータ更新など。 メッセージ配信はオブザーバー パターンに基づいて設計されています。メッセージを処理する必要がある場所では、リスニング コールバックをメッセージ センターに登録します。メッセージがディスパッチされると、メッセージ センターのディスパッチ インターフェイスが呼び出され、メッセージのリスニング キューを走査して、対応するコールバック メソッドを呼び出します。 具体的な計画まずリスニングコールバックタイプを定義する /** * メッセージ監視コールバックメソッド */ エクスポート型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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明
>>: Centos7 サーバーで jar パッケージ プロジェクトを開始する最良の方法
成果を達成する実装コードhtml <input type="radio" ...
目次1. テンプレート2. ジェネリック3. ジェネリック再帰4. デフォルトのジェネリックパラメー...
一般的な提案は、WHERE 条件のインデックスを作成することですが、これは実際には一方的です。インデ...
1. コマンド方式作成された Swarm クラスターで nginx サービスを実行し、--repli...
1. データ整合性の概要1. データ整合性の概要データの冗長性とは、データベース内に重複したデータが...
問題の説明ボタンのスタイルはアイコン + テキストです。フレックス レイアウトを使用して垂直方向に中...
<br />適度に画像を追加すると、Web ページがより美しくなります。 画像タグ &l...
フロントエンド開発者としては、IEの落とし穴は避けて通れません。他のブラウザはいいのにIEは壊れてい...
実際の業務や面接では、「配列の重複排除」の問題によく遭遇します。以下は、js を使用して実装された配...
コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...
目次1. Redisイメージを取得する2. 6つのRedisコンテナを作成する3. Redisコンテ...
目次序文1. 新しいパーティションを準備する2. ブートパーティションをコピーする3. fstabフ...
目次1. はじめに2. 利点3. 使用手順1. Vuexをインストールする2. Vuexを参照する3...
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...
多くのネットユーザーは、なぜ自分のウェブサイトはいつも色の問題を抱えていて、いつも地味に見え、注目を...