0

私は node.js ゲームサーバーを作成しており、webscockets とルームに socket.io を使用しています。ただし、これは主に純粋な JavaScript の質問です。

2 人のプレイヤーごとに乱数を使用して部屋を作成していますが、次のように機能します。

  • ランダムな部屋番号が生成され、グローバルに保存されます。
  • プレイヤーがルームに参加する
  • 彼がこの部屋の 2 番目のプレイヤーである場合、新しい部屋番号が生成され、次のプレイヤーは次の乱数の部屋に参加します。

    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    

    グローバルを使用しない方法はありopenRoomますか?

  • 4

    2 に答える 2

    3

    openRoom変数が内部関数に公開されるように、クロージャを使用する必要があります。

    例えば:

    (function() {
    
    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    
    })();
    

    また、グローバルを格納するグローバル オブジェクトを作成することもできます。

    if (typeof window['MyApp'] == 'undefined') {
    
        MyApp = {
            someVar: someValue
        };
    
    }
    

    これにより、後で取得/設定できます。

    var x = MyApp.someVar;
    
    于 2013-02-08T09:42:56.067 に答える
    0

    Redis.ioのようなデータストアソリューションを見てください。これらは、この種の一時的なもののために設計されており、コードがグローバルで乱雑にならないようにすると同時に、パフォーマンスが著しく低下しないように十分なパフォーマンスを発揮します。

    redisを使用すると、redisのキーを新しい値で更新する関数を呼び出すだけです。

    于 2013-02-08T09:48:43.253 に答える