2014-04-13 57 views
1

我正在尝试使用socket.io模块在node.js中创建一个简单的文本回合制游戏。玩家在轮到他时必须有超时发送文本。如果他不这样做,他失去了这个机会,现在是下一个球员的转身。如何在socket.io游戏中限制玩家轮到的时间?

超时是我真正的问题在这里。我做了一些简单的setTimeout推进转,像这样:

var playerIndex = 0; 
var timer = setTimeout(advancePlayer, turnTime); 

function advancePlayer() { 
    playerIndex = (playerIndex + 1) % numPlayers; 

    // Warns the players about whose turn is now: 
    aknowledgeTurn(playerIndex); 

    timer = setTimeout(advancePlayer, turnTime); 
} 

的问题是,当玩家送他的文字,我需要先检查,轮到他(这是一个相关的问题,因为我我不知道如何在所有玩家之间共享游戏实例/数据,而现在我正在使用数据库),这可能需要足够的时间让计时器耗尽并转到下一个回合,从而使得移动无效或可能跳跃下一位玩家,因为一旦收到文字,计时器应该停止并且转头应该前进。

如果我只是在检查移动是否有效之前清除超时,我不知道如何恢复定时器以防万一出现无效消息(即玩家在他的回合之外发送文本,也许是通过摆弄客户端代码/控制台)。

如何在玩家发送消息时关闭超时而不会陷入这些问题?

回答

2

当您收到举动时,您可以用clearTimeout(timer)取消当前计时器。

然后,在处理完该玩家的移动之后,只需从移动处理程序代码中调用advancePlayer()即可。这将前进到下一个玩家并设置一个新的计时器。

+0

在一个完美的世界中,这样可以很好,但如果错误的玩家发送了消息,我将如何恢复先前的超时?在这种情况下,我不能只是下一个回合。 –

+0

将所有消息处理程序代码(包括'clearTimeout(timer)')放在播放器检查中,比如'if(message.playerId === players [playerIndex] .id)'只需修改它使用正确的变量来比较消息的播放器id现在回合的玩家编号 – itsananderson

+0

是的,我认为这是答案,我仍然担心一些边缘情况(例如玩家在最后一秒发送数据时),但我想我必须测试它活着看看会不会发生,非常感谢! –