5.2.1 多重玩家角色的資料結構
遊戲播放器會將同一地圖內的所有玩家透過繪圖引擎及場景控制模組來顯 示在畫面上。圖 36 是多重玩家系統下的遊戲播放器的類別圖(Class Diagram):
CMapDisplayer
CMusicPlayer CEventHandler
CInteractiveDialog
CLeadingRole
CGameMap CMapTerrain
m_ActorContainer
CRenderEngine
CMovie MessageRecognizer
m_RoleContainer 遊戲播放器
圖 36 遊戲進行中多重角色的類別圖
以下是這些 Class 的功能簡介:
(1) CMapDisplayer:所有遊戲場景的容器(Contianer),負責控制及顯示場景中 的所有物件。
(2) CInteractiveDialog:遊戲的對話盒物件,當播放器執行到對話盒的指令時,
對話盒物件就會展現在畫面上,讓使用者可以點選上面的選項。這時播放器 再根據使用者所點選的選向來執行相對的指令。
(3) CRenderEngine:3D 的繪圖引擎,以微軟的 Direct3D 所包裝而成。包含所 有的 3D 繪圖函式及碰撞處理偵測。
(4) CLeadingRole:代表遊戲主角的物件。包含了目前主角的屬性、身上的裝 備等資訊。
(5) CGameMap:遊戲的場景的物件,也是場景中所有演員與角色的容器 (Container) 負責顯示及控制所有的演員與玩家角色。
(6) CMovie:負責動畫播放的物件。當遊戲播放器執行到播放動畫的指令時,
播放器就會呼叫這個物件來進行動畫播放。
(7) m_ActorContainer:記錄場景上有哪些演員的容器。此資料在遊戲啟動時便 已決定有多少個演員。
(8) m_RoleContainer:記錄場景上有哪些主角以外的玩家角色的容器。此資料 在遊戲啟動時為空集合,在有其他玩家登入與登出遊戲時,透過 Direct Play 將 玩家資料傳送到本端機器上接收後才會視更新狀態自動產生與刪除玩家資料。
5.2.2 連線中的多重玩家角色管理
連線環境中各 Peer 之間玩家狀態資料的交換,採用一塊 Status Pool 的 共享資料區段透過 Direct Play 來傳輸。 Status Pool 內記錄了本端玩家所控制 的主角與其他遠端玩家所使用的配角等所有角色的狀態資料,其中包括角色的帳 號、姓名、座標與屬性等。Status Pool 會使用 Direct Play 的多重執行緒(Multi Thread)方式不斷監聽(Listen)網路上傳來的玩家狀態封包並更新到 Status Pool 內。系統在執行玩家所下的指令前,會先到 Status Pool 內取出所有角色的資料 後才執行命令,命令執行完後,若玩家的狀態產生改變(如玩家下移動命令改變 了主角的座標),則會把新的角色狀態寫進 Status Pool 並立刻使用 Direct Play 將更新狀態發送到所有遠端機器,以保證網路連線內所有的 Peer 機器上的玩 家資料都是最新的。
由於玩家下的指令中會更新角色狀態的情形非常多且非常頻繁,而且所有更 新的資料都一律會廣播(Broadcast)發送到網路內所有機器上,因此其中有一些 封包即使未正確送達,也能迅速由之後的封包得到最新的狀態。故其封包的傳送 並不需太著重於保證正確傳送到;因為 3D 與圖形運算必須暫用大量的 CPU 效 能,因此可以犧牲部分封包傳送的正確性來保障遊戲執行的速度。圖 37 是遊戲 播放器執行時玩家狀態資料封包的傳遞方式:
圖 37 遊戲進行中資料封包的交換方式