ホームページ >バックエンド開発 >PHPチュートリアル >PHP と WebSocket を介してリアルタイム オンライン ゲームを実装する方法

PHP と WebSocket を介してリアルタイム オンライン ゲームを実装する方法

WBOY
WBOYオリジナル
2023-12-17 17:59:22837ブラウズ

PHP と WebSocket を介してリアルタイム オンライン ゲームを実装する方法

インターネット時代において、オンライン ゲームはエンターテイメントの形式としてますます人気が高まっています。多くのゲームではリアルタイムの対話が必要です。これは、サーバーとの接続の確立、リアルタイムのデータ送信、およびピアツーピア通信を意味するため、PHP と WebSocket を使用してゲーム データをリアルタイムでクライアントに送信することは優れたソリューションです。 。次に、PHPとWebSocketを使用してリアルタイムオンラインゲームを実装する方法を例を使って紹介します。

環境の準備

開始する前に、次のソフトウェアがインストールされていることを確認する必要があります:

  1. Apache サーバー
  2. PHP7 および WebSocket一致する PHP 拡張ライブラリ
  3. HTML5 ブラウザ

WebSocket サーバーの作成

Ratchet ライブラリを使用して WebSocket サーバーを作成します。 PHP のバージョンが Ratchet ライブラリと互換性があること、および Ratchet ライブラリが正しくインストールされていることを確認してください。

require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class GameServer implements MessageComponentInterface
{
    private $clients = [];

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients[$conn->resourceId] = $conn;
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        //可以在此处对接收到的数据进行处理
        foreach($this->clients as $client) {
            if ($from !== $client) {
                //将消息发送给客户端
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn)
    {
        unset($this->clients[$conn->resourceId]);
    }

    public function onError(ConnectionInterface $conn, Exception $e)
    {
        echo "Error: ".$e->getMessage(). "
";
        $conn->close();
    }
}

$server = new RatchetApp('localhost', 8080);
$server->route('/', new GameServer());
$server->run();

上記のコードを使用して、基本的な WebSocket サーバーを作成します。クライアントがサーバーに接続すると、サーバーは接続を $clients 配列に追加します。 1 つのクライアントがメッセージを送信すると、サーバーはそのクライアントを除くすべてのクライアントにメッセージを送信します。

上記のコードでは、GameServer クラスを MessageComponentInterface の実装として使用し、次の 4 つのメソッドを提供します。

  1. onOpen: このメソッドは、新しいクライアントが接続したときに実行されます。このメソッドでは、接続を $clients 配列に保存します。
  2. onMessage: このメソッドは、クライアントが新しいメッセージを送信するときに実行されます。このメソッドでは、受信したデータを処理し、他のクライアントにデータを送信できます。
  3. onClose: このメソッドは、クライアントが接続を閉じるときに実行されます。このメソッドでは、$clients 配列から接続を削除します。
  4. onError: このメソッドはエラーが発生したときに実行されます。

WebSocket サーバーを用意したので、このサーバーを使用してクライアントからのデータを処理し、他のクライアントにデータを送信します。

クライアント接続のバインド

クライアント側では、WebSocket プロトコル経由でサーバーに接続し、ゲームを初期化する必要があります。

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    // 发送初始化消息
    conn.send('init');
};

conn.onmessage = function(e) {
    // 处理服务器发送的数据
    handleServerMessages(e.data);
};

コードの説明:

  1. WebSocket オブジェクトを使用して接続を初期化し、それをサーバーのアドレスとポートにバインドします。
  2. 接続が確立されると、conn.send() メソッドを通じて初期化データがサーバーに送信されます。なお、ここでは初期化データとして init を使用していますが、実際のシナリオに応じてデータ内容を調整してください。
  3. サーバーはデータを受信すると、送信されたデータを処理するために onmessage メソッドを呼び出します。サーバーから送信されたデータはこのメソッドで処理できます。

ゲーム データの処理

クライアントがサーバーに接続して初期化すると、ゲーム データの処理を開始できます。

function handleServerMessages(data) {
    if (data === 'init') {
        // 初始化游戏
        return;
    }

    // 处理游戏数据
    // ...

    // 向服务器发送游戏数据
    conn.send(data);
}

説明:

  1. サーバーが初期化データを送信すると、メッセージをキャプチャしてゲームを初期化します。
  2. ゲームの実行中に、データをサーバーに送信し、サーバーから送信されたデータを処理できます。

コードの概要

上記の手順により、ゲーム データ送信を処理する PHP WebSocket サーバーを作成し、クライアント上でデータ送信とゲーム処理を実装しました。以下は、完全な PHP および JavaScript コードの例です。

PHP サーバー:

require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class GameServer implements MessageComponentInterface
{
    private $clients = [];

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients[$conn->resourceId] = $conn;
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        //可以在此处对接收到的数据进行处理
        foreach($this->clients as $client) {
            if ($from !== $client) {
                //将消息发送给客户端
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn)
    {
        unset($this->clients[$conn->resourceId]);
    }

    public function onError(ConnectionInterface $conn, Exception $e)
    {
        echo "Error: ".$e->getMessage(). "
";
        $conn->close();
    }
}

$server = new RatchetApp('localhost', 8080);
$server->route('/', new GameServer());
$server->run();

クライアント JavaScript コード:

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    // 发送初始化消息
    conn.send('init');
};

conn.onmessage = function(e) {
    // 处理服务器发送的数据
    handleServerMessages(e.data);
};

function handleServerMessages(data) {
    if (data === 'init') {
        // 初始化游戏
        return;
    }

    // 处理游戏数据
    // ...

    // 向服务器发送游戏数据
    conn.send(data);
}

この例では、PHP と WebSocket を使用してリアルタイム オンライン ゲームを実装する方法を示し、サンプルを提供します。コード。ニーズに合わせて調整および変更できます。

以上がPHP と WebSocket を介してリアルタイム オンライン ゲームを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。