我正在尝试使用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);
}
的问题是,当玩家送他的文字,我需要先检查,轮到他(这是一个相关的问题,因为我我不知道如何在所有玩家之间共享游戏实例/数据,而现在我正在使用数据库),这可能需要足够的时间让计时器耗尽并转到下一个回合,从而使得移动无效或可能跳跃下一位玩家,因为一旦收到文字,计时器应该停止并且转头应该前进。
如果我只是在检查移动是否有效之前清除超时,我不知道如何恢复定时器以防万一出现无效消息(即玩家在他的回合之外发送文本,也许是通过摆弄客户端代码/控制台)。
如何在玩家发送消息时关闭超时而不会陷入这些问题?
在一个完美的世界中,这样可以很好,但如果错误的玩家发送了消息,我将如何恢复先前的超时?在这种情况下,我不能只是下一个回合。 –
将所有消息处理程序代码(包括'clearTimeout(timer)')放在播放器检查中,比如'if(message.playerId === players [playerIndex] .id)'只需修改它使用正确的变量来比较消息的播放器id现在回合的玩家编号 – itsananderson
是的,我认为这是答案,我仍然担心一些边缘情况(例如玩家在最后一秒发送数据时),但我想我必须测试它活着看看会不会发生,非常感谢! –