CocosCreator 入門チュートリアル: ネットワーク通信

CocosCreator 入門チュートリアル: ネットワーク通信

ネットワーク通信の概要

オンライン ゲームを開発する場合、必然的にネットワーク通信に対処する必要があります。注意すべき問題がいくつかあります:

1. 迅速な開発のため、サーバーは初期段階では http 通信を使用し、後で websocket/socket に変更する場合があります。

2. httpとwebsocket/socket通信の両方が存在する

3. 通信データ形式はいつでも JSON またはプロトコル バッファに置き換える必要があり、追加のヘッダーを追加する必要が生じる場合があります。

4. 初心者ガイドのシミュレーションにはローカル データを使用するため、リクエストをバックエンドに送信する必要はありません。

5. 再接続後の簡単なデータ同期

具体的な実装

1 番目と 2 番目の質問に関して、通信モジュールを設計する際には、通信を可能な限り統一された外部インターフェイスに抽象化し、ゲーム開始時に異なるドライバーを通じてインスタンスを作成することを検討します (通信方法が 1 つだけの場合は、単一のインスタンスを使用します)。

パブリックコンストラクタ(ドライバ: ConnectDriver) {
        this._driver = ドライバー;
}

まず、一般的なネットワーク通信データ構造を定義します。リクエストはデータと制御の 2 つのタイプに分かれており、ハートビート、ログイン、再接続を区別するために使用されます。

/**
 * リクエストタイプ */
エクスポート列挙型リクエストタイプ{
    データ = 1、
    Ctrl
}
 
/**
 * ネットワーク通信データ構造 */
エクスポートインターフェースNetData {
    seq?: number; // シリアル番号 mod: number; // モジュール cmd: number; // コマンド path?: string; // パス data?: any; // データ tmpData?: any; // データプロセッサの一時データ status?: number; // ステータスコード type?: RequestType; // リクエストタイプ}

次に共通の外部インターフェースを定義します

パブリックオープン(url: 文字列、ポート: 数値、isBinary: ブール値、タイムアウト: 数値、再試行回数: 数値、パラメーター: 任意、cb: (succ: ブール値) => void): void {}
 
パブリックclose(): 数値{}
 
パブリック再オープン(cb: (succ: boolean) => void): void {}
 
パブリック sendData(データ: NetData、パラメーター: HttpReq | any、succCb: (データ: NetData) => void、failedCb: (コード: 数値、理由: 文字列) => void): void {}
 
パブリック resendNotRecv(): void {}

resendNotRecv は、再接続後に応答を受信しなかったパケットを送信するために使用され、バックエンドはシーケンス番号に基づいてそれを処理するかどうかを決定します。

ここではプッシュ処理は行われません。実際には、プッシュはサーバーのデータを受信した後にリスナーにブロードキャストを呼び出すことです。以下はリスナーの定義です

/**
 * ネットワーク接続イベント監視インターフェース */
エクスポートインターフェースConnectEventListener {
    onOpen(ドライバ: ConnectDriver);
    onClosed(ドライバー: ConnectDriver);
    onError(ドライバー: ConnectDriver、メッセージ: 文字列);
    onSendStart(ドライバー: ConnectDriver);
    onRecvEnd(ドライバー: ConnectDriver);
}
 
/**
 * ネットワークイベント監視インターフェース */
エクスポートインターフェース NetEventListener は ConnectEventListener を拡張します {
    onPush(ドライバー: ConnectDriver、データ: NetData): void;
}

外部関係者に登録および削除インターフェースを提供する

パブリックaddEventListener(リスナー: NetEventListener): void {}
 
パブリックremoveEventListener(リスナー: NetEventListener): void {}

3 番目の問題については、データを送信する前とデータを受信した後に傍受と前処理を実行するためのプリプロセッサをいくつか定義する必要があります。

/**
 * ネットワーク通信データプロセッサインターフェース */
エクスポートインターフェースNetDataProcessor {
    プロセス要求データ(データ: 任意): 任意;
    プロセス応答データ(データ: 任意): 任意;
}

外部への追加および削除インターフェースを提供し、通信データ形式を柔軟に定義できるようにします。

パブリックaddDataProcessor(プロセッサ: NetDataProcessor): void {}
 
パブリックremoveDataProcessor(プロセッサ: NetDataProcessor): void {}

4 番目の問題に関しては、リクエストが送信される前にそれを処理する特別なインターセプターも追加します。インターセプターがそれを処理できる場合、リクエストはバックエンドに送信されなくなります。

/**
 * サーバーインターフェースをシミュレートする */
エクスポートインターフェースSimServer{
    handleRequest(データ: NetData): NetData;
}

外部設定インターフェースを提供する

パブリック setSimServer(サーバー: SimServer): void {}

5 番目の質問については、すべてのデータ要求にシリアル番号が付けられ、要求が記録され、応答のない要求パケットはキューに配置されます。再接続後、これらのパケットは処理のためにバックエンドに再送信されます。

パブリック resendNotRecv(): void {}

以上がCocosCreator入門チュートリアルにおけるネットワーク通信の詳しい内容です。CocosCreatorネットワーク通信の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Cocos2d-x 3.x 入門チュートリアル (パート 2): ノード クラス
  • Cocos2d-x 3.x 入門チュートリアル (I): 基本概念
  • Cocos2d-x 入門チュートリアル (詳細な例と説明)
  • CocosCreatorでシューティングゲームを作る詳しい解説
  • CocosCreatorでクールなレーダーチャートを描く方法
  • CocosCreator MVCアーキテクチャの詳細な説明
  • CocosCreatorメッセージ配信メカニズムの詳細な説明
  • CocosCreatorでWeChatゲームを作成する方法
  • CocosCreator システムイベントがどのように生成され、トリガーされるかについての詳細な説明
  • CocosCreatorでゲームコントローラーを使用する方法
  • CocosCreator Huarongdaoデジタルパズルの詳しい説明
  • CocosCreator 入門チュートリアル: TS で初めてのゲームを作る

<<:  CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

>>:  Linuxのsortコマンドの複数のパラメータを理解するための1つの質問

推薦する

TypeScript インターフェースの紹介

目次1. インターフェース定義2. 属性2.1 オプション属性2.2 読み取り専用プロパティ3. ク...

CSS の 6 つの重要なセレクター (3 秒で覚える)

出典: https://blog.csdn.net/qq_44761243/article/deta...

Dockerイメージの階層化の原理の詳細な説明

ベースイメージベースイメージには 2 つの意味があります。他のイメージに依存せず、ゼロから構築します...

Vue ログインページ用の動的パーティクル背景プラグインの実装

目次動的パーティクル効果は次のとおりです。プラグインをインストールする動的パーティクル効果は次のとお...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...

CocosCreator の新しいリソース管理システムの分析

目次1. 資源と建設1.1 クリエイターリソースファイルの基本1.2 リソースの構築2. アセットバ...

Windows 環境での MySQL 8.0 のインストール、設定、アンインストール

ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.17-wi...

Javascriptで戦略パターンを実装する方法

目次概要コードの実装要約する概要戦略パターンは、JavaScript デザイン パターンにおける動作...

Blazor における CSS 分離の問題

1. 環境VS 2019 16.9.0 プレビュー 1.0 .NET SDK 5.0.100 2. ...

WeChatアプレット認証ログインを処理するエレガントな方法

序文WeChat ミニプログラム プロジェクトでユーザー情報を取得し、ユーザー ログインを実装する場...

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

Vue モバイル開発で better-scroll を使用するときにクリック イベントが失敗する問題の解決策

最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...

MySQL 正規表現 (regexp と rlike) の検索機能の例分析

この記事では、例を使用して MySQL 正規表現 (regexp および rlike) の検索機能を...

MySQL 学習ノート: 完全な SELECT ステートメントの使用例と詳細な説明

この記事では、MySQL 学習ノートの select ステートメントの完全な使用方法を例を使用して説...

Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する

Docker は本当に素晴らしいです。特に、仮想マシンを使用する場合に比べて、Docker イメージ...