如何限制玩家在socket.io游戏中的转身时间?

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

暂停是我真正的问题在这里。 我做了一些简单的setTimeout来推进轮stream,像这样:

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

问题是,当玩家发送他的文本,我需要先检查是否轮到他(这是一个相关的问题,因为我不知道如何分享所有玩家的游戏实例/数据,现在我使用一个数据库),这可能需要足够的时间来计时器用完,并调用下一个回合,使移动无效或可能跳转下一个玩家,因为一收到文本,计时器应停止和转向应该前进。

如果我只是在检查移动是否有效之前清除了超时,那么在消息无效的情况下,我不知道如何恢复定时器(也就是说,玩家在轮到他之外发送了一个文本,也许是通过摆弄客户端代码/控制台)。

当玩家发送消息时,如何closures超时?

当你收到一个移动,你可以取消当前定时器clearTimeout(timer)

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