2014-04-13 78 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

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