0

Counter-Strike サーバーを作成しているとします。1 つのロビーと、ゲーム セッションが行われる複数の部屋があります。

IE 3 ノード サーバー、nginx ロード バランサー、redis があります。

スキーマ

私はredisアダプターでsocket.ioを使用しているので、任意のサーバー上のすべてのクライアントにメッセージを送信できます。

一つ理解できません。たとえば、次のようなものがあります。

    var currentGames = {};


socket.on('createGame', function(gameName){
  var game = new Game();
  game.addPlayer(socket.id);


  currentGames.push();

  // ... Send to all clients, that game created and they can join
});

socket.on('joinGame', function(gameName){
  currentGames[gameName].addPlayer(socket.id);

  // ... Send to all players of this game, that player joined
});


socket.on('walk', function(gameName, coordinates){
   currentGames[socket.id].walk(player, coordinates);

   // ... Get all players positions and send to clients
});


class Game
{
  gameName;
  players = {};
  score;

  constructor(name){
    this.gameName = name;
  }

  addPlayer(player){
    players[name] = new Player(player);
  }

  walk(id, coordinates){
    this.players[id].updatePosition(coordinates);
  }  
}

class player
{
  id;
  life = 100;
  coordinates = {0,0,0};
  kills;
  death;

  constructor(id){
    this.id = id;
  }

  updatePosition(coords){
    this.coordinates = coords;
  }


}

たとえば、このコードを書きました。

たとえば、user_1 は node-1 にあり、user-2 は node-2 にあります。

user_1 がゲームを作成すると、インスタンスが作成され、node-1 に保存されます。

そのため、user_2 が作成されたゲームに関する情報を受け取り、参加ボタンをクリックすると、クライアントはサーバーにリクエストを送信し、ノード 2 には user_1 が作成したゲーム インスタンスは存在しません。

私が話していることを理解していただければ幸いです (私の英語は上手ではありません)。

currentGamesゲームインスタンスのオブジェクトは、すべてのノードに対してグローバルでなければならないと思います。しかし、方法がわかりません。

ゲーム情報の保存には、代わりに redis や mongo などを使用する必要がありvariableますか?

私は間違った方法で行っていますか?

4

1 に答える 1

0

U は、Redis、ルーム、およびゲーム インスタンスでもゲーム ステートを同期する必要があります。 + エンティティ状態 - ゲーム状態を管理し、保存して設定し、ゲーム情報を Redis に取得します
+ クライアント状態 - 各接続クライアントにはクライアント状態があり、エンティティ状態と同期し、ゲーム ループの各ティック、エンティティ状態間の違いを確認しますおよびクライアント状態をクライアントに送信し、ゲームクライアントを更新します

于 2016-05-25T11:26:13.370 に答える