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つの問題を抱えて:それ=このクロージャを使用して
を?関数。見苦しい。
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);
});
});
それが大幅に改善することはできますか?
バインドオプションは完全に機能します。面倒なことに、私は既にバインドを試みていましたが、私はそれを正しく実装していませんでした。今私はなぜ見ることができます!しかし、質問: 'client.on(' message '、this.onSocketMessage.bind(this));'そのメッセージが受信されると、通常onSocketMessage内でthis.idが利用可能になります(これはクライアント/ソケットIDになります)、(データ)が関数に渡されます。データは引き続き渡されますが、私はthis.idにアクセスできなくなりました。私はそれをどのように受け継がれるのだろうか? –
できません。そのため、 'bind'は本当にあなたの最初の問題に役立つだけです。あなたの2番目の問題については、私はメソッドに他の方法で 'プレーヤー 'を取得する作業を行います。 –
あなたの助け、素晴らしい答えに感謝します。 :) –