HTML5遊戲開發進階 12:多人對戰遊戲操作

CopperDong發表於2018-02-14

    使用同步網路模式實現真正的多人對戰遊戲操作框架。我們將研究如何處理網路遊戲中一些典型的難題,比如,傳輸延遲和同步性。為了保證遊戲的同步,我們將使用前幾章設計的sendCommand()方法來保證玩家的命令在兩個瀏覽器上都已執行。我們將在遊戲中使用第10章的觸發器來判斷遊戲的獲勝或失敗。最後,我們將為遊戲實現一個聊天系統。

12.1 同步網路模型

     實現多人對戰最重要的一個挑戰是確保所有的玩家是同步的。這意味著遊戲中任何一個變化(比如,玩家命令某個單位進行移動或攻擊)都要傳遞給其他的玩家,使他們也能看到這個變化。

     為了保證兩個玩家完全同步,我們將實現所謂的同步網路模型架構。兩個玩家將以相同的遊戲狀態開始。當某個玩家命令單位時,我們將這個命令傳送給伺服器,而不是立刻執行它。伺服器收到後,將同樣的命名傳送給每個線上的玩家,並指定何時執行該命令,玩家接收到命令後,將在指定的時間執行命令,這樣就可以保證遊戲是同步的。

     伺服器將執行一個自己的計時器,這個計時器每秒步進10次。當玩家向伺服器傳送命令時,伺服器將記錄接收到命令的時間。接著,伺服器將命令傳送給玩家,並指定執行該命令的時刻。玩家接收到命令後,需要延遲到正確的時刻才執行命令。

     需要記住的是,因為伺服器需要確保所有的玩家同時執行命令,所以它要等到所有的玩家都接收到該命令後,才允許計時器進行下一次步進。這就是我們為什麼稱這個架構是同步的。

     事實上,網路傳輸時間會造成交流上的延遲,因此,這個過程遠比上面描述的複雜。有時候,訊息從伺服器傳到客戶端需要花費數百毫秒的時間。我們的網路模型需要考慮對傳輸時間進行測量,以確保遊戲進行流暢。

     在每個玩家第一次連線到伺服器時,為其測量網路傳輸時間。

     測量網路傳輸時間:傳輸時間,即訊息從伺服器傳送到客戶端所用的時間。我們將在伺服器和客戶端間往返傳遞數次訊息,然後計算傳遞一次訊息所用時間的均值。

     當瀏覽器收到來自伺服器的latency_ping訊息時,就立刻向伺服器回覆一條latency_pong訊息。

     傳送命令:當玩家將下達給單位的命令傳送給伺服器時,我們就將這條命令轉發給所有的玩家,並指定在tickLag時間之後,執行該命令。

12.2 結束多人對戰

     有兩種結束方式。第一種是,一個玩家以關卡指定的方式擊敗了另一個玩家,另一種就是一個玩家關閉了瀏覽器或斷開了與伺服器的連線。

12.3 實現玩家聊天

    定義一個input元素作為聊天輸入框

      


相關文章