2012-01-06 60 views
1

当我开始游戏服务器的新实例,它设置了插座和听众如下。调用函数(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); 
    }); 
} 

然后我有两个原型GameServer.prototype.onSocketMessage & onSocketDisconnect。

我有两个问题与当前的代码:

  1. 使用=这和关闭?功能。看起来很丑。

  2. 当onSocketMessage被调用时,这个想法是它的工作出了什么消息,然后调用内部游戏服务器的另一个功能。只有这是不可能的,因为这属于socket.io系统。请看下图:

...

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

this.player不再为这一点。不再是GameServer的一部分。

如果我的插座设置和消息传递功能,游戏服务器和原型之外处理?

或者我还能怎么解决呢?

干杯

编辑

好了,所以我已经试过这和它的作品,但看起来很丑陋,我认为:

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

有两件事可能有帮助。第一件事:

您可以使用the bind method修改功能的愿景this

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插座。因此,举例来说,如果一个插座始终与玩家相关的,你可以做

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(); 
}); 

getset方法采取回调,因为Socket.IO数据存储可以被设置为在内存中的其他东西商店;例如,Redis。

+0

绑定选项完美工作。有趣的是,我已经尝试绑定,但我实施了不正确的,它没有工作。现在我明白了为什么!虽然问题:'client.on('message',this.onSocketMessage.bind(this));'当收到该消息时,通常在onSocketMessage中,你可以使用this.id(这将是客户端/套接字ID)和(数据)传递给你的函数。数据仍然通过,但我不再有任何访问this.id.我怎么会得到这个通过? – 2012-01-06 05:45:12

+0

你不能;这就是为什么'bind'对你的第一个问题真的很有用。对于你的第二个问题,我会努力让'player'以某种方式进入方法。 – 2012-01-06 07:07:08

+0

好的!感谢您的帮助,出色的答案。 :) – 2012-01-06 07:14:20