我正在嘗試使用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
是的,我認爲這是答案,我仍然擔心一些邊緣情況(例如玩家在最後一秒發送數據時),但我想我必須測試它活着看看會不會發生,非常感謝! –