2012-01-06 8 views
1

GameServerの新しいインスタンスを起動すると、次のようにソケットとリスナーが設定されます。ソケットメッセージ(socket.io/node.js)の関数を呼び出す

var GameServer = function() { 
    this.player = new Player(); 
    var that = this; 

    // Setup sockets and listeners 
    var socket = io.listen(8000); 
    socket.sockets.on('connection', function(client) { 
     client.on('message', that.onSocketMessage); 
     client.on('disconnect', that.onSocketDisconnect); 
    }); 
} 

私は、2つのプロトタイプGameServer.prototype.onSocketMessage & onSocketDisconnectを持っています。

私は、現在のコードを持つ2つの問題を抱えて:それ=このクロージャを使用して

  1. を?関数。見苦しい。

  2. onSocketMessageを呼び出すと、メッセージがGameServer内の別の関数を呼び出しているかどうかがわかります。これはsocket.ioシステムに属しているため、これは不可能です。下記参照:

...

function onSocketMessage() { 
    this.player.move(); 
} 

this.playerこのよう使用できなくなりました。もはやGameServerの一部ではありません。

私のソケット設定とメッセージの受け渡しは、GameServerの関数とプロトタイプの外で処理する必要がありますか?

他にどのように解決できますか?

乾杯

EDIT

[OK]を私はこれを試してみましたので、それは私が考えるに動作しますが、かなり醜い:

var socket = io.listen(8000); 
socket.sockets.on('connection', function(client) { 
    client.on('message', function (data) { 
     that.onSocketMessage(this, that, data); 
    }); 
    client.on('disconnect', function() { 
     that.onSocketDisconnect(this, that); 
    }); 
}); 

それが大幅に改善することはできますか?

答えて

2

2つのことが役立ちます。最初のもの:

thisの関数の視覚をthe bind methodで変更することができます。

socket.sockets.on('connection', function(client) { 
    client.on('message', this.onSocketMessage); 
    client.on('disconnect', this.onSocketDisconnect); 
}.bind(this)); 

機能の最後にbind(this)が呼び出されていることに注意してください。これはJavaScriptが関数の外にあるthisを関数内に作成し、関数内にthisを作成するように指示します。 (機能内にthisを作成したい場合は、MySomethingと同様に簡単にbind(MySomething)を呼び出すことができますが、bind(this)が最も一般的です)。

シング秒:

あなたはSocket.IOソケットにデータを格納することができます。 1つのソケットは常にプレイヤーに関連付けられているのであれば、たとえば、あなたはSocket.IOデータストアがインメモリ以外に設定することができますので、getsetメソッドがコールバックを取る

socket.set('player', player, function() { 
    // callback is called when variable is successfully stored 
    console.log('player has been stored'); 
}); 

// and later 

socket.get('player', function(err, player) { 
    // callback is called either with an error set or the value you requested 
    player.move(); 
}); 

を行うことができます格納;例えば、Redis。

+0

バインドオプションは完全に機能します。面倒なことに、私は既にバインドを試みていましたが、私はそれを正しく実装していませんでした。今私はなぜ見ることができます!しかし、質問: 'client.on(' message '、this.onSocketMessage.bind(this));'そのメッセージが受信されると、通常onSocketMessage内でthis.idが利用可能になります(これはクライアント/ソケットIDになります)、(データ)が関数に渡されます。データは引き続き渡されますが、私はthis.idにアクセスできなくなりました。私はそれをどのように受け継がれるのだろうか? –

+0

できません。そのため、 'bind'は本当にあなたの最初の問題に役立つだけです。あなたの2番目の問題については、私はメソッドに他の方法で 'プレーヤー 'を取得する作業を行います。 –

+0

あなたの助け、素晴らしい答えに感謝します。 :) –