我正在尝试使用socket.io模块在node.js中创建一个简单的基于文本回合的游戏。玩家必须有超时才能在轮到他时发送文本。如果他没有这样做,他就会失去机会,现在轮到下一位球员了。
超时是我真正的问题。我做了一些简单的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);
}
问题在于,当玩家发送他的文本时,我需要首先检查轮到他(这是一个相关问题,因为我不确定如何在所有玩家之间共享游戏实例/数据,以及现在我正在使用一个数据库)这可能需要足够的时间让计时器用完并调用下一个转弯,使移动无效或者可能跳转到下一个玩家,因为一旦收到文本,计时器应该停下来,转弯应该前进。
如果我只是在检查移动是否有效之前清除超时,我不知道如果消息无效,如何恢复计时器(即玩家在轮到他之后发送文本,可能是通过摆弄客户端代码/控制台)。
当播放器发送消息而不会遇到这些问题时,如何关闭超时?
答案 0 :(得分:2)
当您收到移动时,您可以使用clearTimeout(timer)
取消当前的计时器。
然后,在您处理了该播放器的移动后,只需从您的移动处理程序代码中调用advancePlayer()
即可。这将进入下一个玩家并设置一个新的计时器。