【正文】
為了防止外掛的出現(xiàn), 首先 要 對數(shù)據(jù)包進行加密,當然大多數(shù)游戲都是這樣做的,但效果并不明顯,因為能加密就能解密。還有一點就是對于一些不關鍵的場景進行降面進行渲染,使游戲能更快速度的進行。 = STATE_MOVE。在個 BUG 在 XP 系統(tǒng)下時是存在的,但是在 7 或更高系統(tǒng)下是不會存在。 優(yōu)化可以收集完用客戶端事件需要同步的所有數(shù)據(jù)儲存在緩沖中一般大小設置 4K,再統(tǒng)一包裝一次發(fā)送,而不是任何一個游戲對象的狀態(tài)改變了,就立即更新的方式,大大降低通迅頻率 提高客戶端與服務端的時時通信效率。如果對象在開頭就被聲明然而卻在 20 行以后才被使用的話,就不能做這樣的保證。這一部分我們集中討論四個問題:初始化 賦值,在程序確實要使用的地方放置聲明,構造函數(shù)的初始化列表, prefix postfix運算符。一個 debugversion 可執(zhí)行體要比 releaseversion 大出 40%。服務器是否能通過平均在線 300 人承受。 if(Dist Size) Hit = FALSE。u, amp。D3DXVECTOR3(XStart,YStart,ZStart), amp。 他是 cNodeTreeMesh::CheckIntersect函數(shù) 實現(xiàn)代碼如下: D3DXVec3Normalize(amp。 應為平面是無窮大的,所以一條射線只要他不是平行于平面的,總是能夠與平面相交。 前面講述過,并不需要 DPN_APPLICATION_DESC 結構體中的所有信息。 //未使用 DWORD dwReservedDataSize。 //設置允許的最大玩家數(shù) DWORD dwCurrentPlayers。 //結構體的大小 DWORO dwFlags。該函數(shù)非常簡單,它僅僅需要區(qū)分 接收到的是哪一種消息,并盡可能快地處理消息。如果連接被成功地接收, accept()函數(shù)將返回一個新的套接字描述符,這個新的套接字將用來處理新的連接;如果這里出現(xiàn)了一個錯誤, accept()函數(shù)將返回INVALID_SOCKOET,這時我們需要調用 WSAGetLastError()以得到更多的有關錯誤的細節(jié)。 游戲通信實現(xiàn) 服務端的創(chuàng)建: 第 25 頁 共 30 頁 用 Socket()函數(shù)來創(chuàng)建一個在通信中使用的套接字,然后調用 bind(),將套接字描述符和一個指針傳遞給一個地址結構 amp。 3 個同追蹤有關的函數(shù)隨著時間追蹤攝像機的移動路徑。 觀察變換矩陣,用 cCamera 類實現(xiàn)。 游戲 角色移動與轉向 實現(xiàn) 角色的移動需要 cWorldPosition 類,計算世界變換 矩陣。 (amp。需要實力 cLight類,然后挑選一種要使用的光源類型設置光 源的顏色,并將光源置于任何適當?shù)奈恢谩T?cTexture類能夠從磁盤上的一幅圖像文件或現(xiàn)有的 IDirect3DTexhure9對象加載紋理。首先要調用 Init,然后就可以枚舉各種顯示模式或調用 SetMode 最少只需要一個父窗口的句柄。 使用 cNetworkClient 處理客戶端: cNetworkClient,它用于處理網(wǎng)絡的客戶端, cNetworkClient 對象的使用方法同 cNetworkServer對 象的使用方法相似,但是有一點不同,那就是連接到網(wǎng)絡的方法。使用此內(nèi)核,就能夠暢游網(wǎng)絡。 聲音內(nèi)核 讓用戶享受多聲道的聲音和音樂。 輸入類+ 初始化 ()輸入設備類+* m _I n p u t+ 創(chuàng)建 ()+ 空閑 ()+ 讀取 ()+ 獲得 () 使用 cInput 初始化 DirectInput: 使用輸入系統(tǒng)的第一步就是初始化 DirectInput,這也是 cInput 類的用途。 BOOL Free()。 BOOL ScaleRel(float XAdd, float YAdd, float ZAdd)。 BOOL MoveRel(float XAdd, float YAdd, float ZAdd)。為什么不使用 cMesh對象處理渲染呢?原因在于內(nèi)存使用( memory usage)。} // 創(chuàng)建一個枚舉對象 if(FAILED(pDXFileCreateEnumObject((LPVOID)FilenameDXFILELOAD_FROMFILE, amp。 cMesh部分代碼如下: BOOL cMesh::Load(cGraphics *Graphics, char *Filename, char *TexturePath) {// 創(chuàng)建的文件對象 if(FAILED(DirectXFileCreate(amp。matXRotation)。matYRotation)。 m_matRotation = matZRotation。 D3DXMatrixRotationY(amp。 m_YRot = YRot。} 觀察變換和 cCamera: cCamera 類和 cWorldPosition 類非常類似,但 cCam 類處理的是觀察變換矩陣。m_ZRotation = ZRot。 cVertexBuffer部分代碼如下: 世界變換和 cWorldPosition: 雖然處理世界變換矩陣并不難,但使用一個類來處理諸如世界坐標、旋轉值以及縮放因子等所有細,就更簡單明了。m_Font)))return FALSE。 = Underline。 第 21 頁 共 30 頁 // 設置字體名稱和高度 strcpy(, Name)。 if(Graphics == NULL || Name == NULL)return FALSE。 SetAttenuation0()。 Move(, , )。使用光照可以通過很多方式實現(xiàn)很多效果。 BOOL GetSpecularColor(char *Red, char *Green, char *Blue)。 BOOL GetDiffuseColor(char *Red, char *Green, char *Blue)。 // 返回寬度(間距)的紋理 long GetHeight()。使用全彩色成像可以使簡單的多邊形顯得更逼真。 BOOL SetMaterial(cMaterial *Material)。 cGraphics 部分代碼如下: BOOL SetPerspective(float FOV=D3DX_PI / , float Aspect=, float Near=, float Far=)。 cObject 類控制了對象的方位、網(wǎng)格以及動畫狀態(tài) cAnimation 包含一個 .X 文件加載的動畫列表。 圖形內(nèi)核 用于繪制圖形。進程和 cProcessManager棧上的每一個函數(shù)在每幀都要被調用,除了這點小的不同以外, cProcessManager和 cStateManager非常相。此對象能夠注冊窗口類、創(chuàng)建應用程序窗口以及進入處理應用程序窗口消息的消息泵,并且在適當?shù)臅r候調用內(nèi)部的類函數(shù)。游戲內(nèi)核幾乎含有一個游戲工程需要的所有函數(shù),這些函數(shù)一般用于繪制圖像、播放聲音、處理用戶輸入以及處理應用程序的處理過程。組合允許在運行期間通過設置類的屬性來改變類的行為,也可以通過使用接口來組合一個類,它提供了更高的靈活性,并可以隨時實現(xiàn)?!坝螒蛞晥D類”因為將多個功能放在同一個類中,功能之間就形成了關聯(lián),改變其中一個功能,有可能中止另一個功能,需要新一輪的改進來避免可能出現(xiàn)的問題。符合開閉原則、封裝變化的宗旨。通過對世界坐標系、 IDirect3D9 初始化 、燈光等功能進行包裝,較好地實現(xiàn)了該目標。 第 17 頁 共 30 頁 可維護性設計 通過充分應用面向對象設計原則,代碼具有較強的可維護性。傳統(tǒng)的 C/S 模式一般都有預定義的客戶端和服務器。一個請求總是首先被客戶發(fā)出,然后服務器總是被動地接受請求,返回客戶需要的結果。 C/S模式也是當前游戲程序中很流行的一種方式。 TCP 連接的每一方都有一個固定大小的緩沖空間。既然TCP 報文段作為 IP 數(shù)據(jù)報來傳輸,而 IP 數(shù)據(jù)包的到達可能會失序,因此 TCP 報文段的到達也可能會失序。這個確認不是立即發(fā)送,通常將推遲幾分之一秒。 TCP 提供可靠性的方式 應用數(shù)據(jù)被分割成 TCP 認為最合適發(fā)送的數(shù)據(jù)塊。 源文件部署 1. 安裝 VC++ 2. 安裝 directx sdk 第 7 頁 共 30 頁 3. 打開 VC++ 工具 選項 目錄 4. 選擇 include file 把 directx sdk include 目錄導入 選著 library file 把 directx sdk LIB 目錄導入 2. 游戲方案 游戲功能 客戶端: 功能 1 場景地圖硬盤加載 功能 2 角色模型加載 功能 3 角色動畫生成 功能 4 三維視角的世界觀,體現(xiàn)真實游戲畫面 功能 5 角色技能,華麗而又優(yōu)美 ... 服務端: 功能 1 網(wǎng)絡通信,數(shù)據(jù)的交換 功能 2 數(shù)據(jù)分發(fā)到連接上的客戶端 功能 3 數(shù)據(jù)分析,分析與處理不同 ID 的數(shù)據(jù) 功能 4 判斷游戲進行所產(chǎn)生的邏輯問題 第 8 頁 共 30 頁 技術選型 網(wǎng)絡架構 第 9 頁 共 30 頁 3. 游戲詳細設計 界面 設計 界面圖 啟動服務端 啟動客戶端 服務端監(jiān)控 客戶端對戰(zhàn) 第 10 頁 共 30 頁 區(qū)域描述: 第 11 頁 共 30 頁 區(qū)域 1:主界面是一個 3D視角的區(qū)域 區(qū)域 2:主界面中間是玩家的角色所在位置 操作說明: (1)Mouse點擊左鍵或者按下空格鍵,為角色普通攻擊 (2)Mouse移動改變攝像機的視角 (3)鍵盤 W鍵為角色正面前進 (4)鍵盤 S鍵為角色后面倒退 (5)鍵盤 A鍵為角色左移動 (6)鍵盤 D鍵為角色右移動 (7)鍵盤 1鍵為角色技能釋放控制鍵 界面交互圖 第 12 頁 共 30 頁 客戶端框架設計 主類( c A p p )++ 初始化 ()+ 初始化游戲 ()+ 加入游戲 ()+ 接收 ()+ 渲染場景 ()+ 更新玩家 ()+ 框架 ()連接類( c L ie n t )+ 連接完成 ()+ 接收 ()圓( F r u s t u m )+ 檢測矩形 ()+ 檢測球 ()+ 檢測點 ()樹節(jié)點( c N o d e T r e e M e s h )+ 查克相交 ()+ 樹節(jié)點網(wǎng) ()+ 創(chuàng)建 ()+ 渲染 ()玩家消息+ P la y e rI D數(shù)據(jù)消息+ D a t a+ H e a d e r玩家類+ X Y Z消息頭+ T y p e+ S iz e+ P la y e rI D圖型類庫輸入類庫 網(wǎng)絡類庫消息包狀態(tài)消息+ S t a t e+ X P os , Y P os , Z P os+ D ire c t ion+ S p e e d+ F ire+ L a t e n c y玩家創(chuàng)建消息+ X P os , Y P os , Z P os+ D ire c t ion玩家銷毀消息 服務端框架設 計 主類( c A p p )++ 初始化 ()+ 初始化游戲 ()+ 主游戲 ()+ 接收 ()+ 發(fā)送 ()+ 更新網(wǎng)絡 ()+ 更新玩家 ()+ 更新延遲 ()+ 框架 ()連接類( c Se r v e r )+ 連接完成 ()+ 接收 ()玩家消息+ P la y e rI D數(shù)據(jù)消息+ D a t a+ H e a d e r玩家類+ X Y Z+ D ire c t ion+ S p e e d消息頭+ T y p e+ S iz e+ P la y e rI D圖型類庫網(wǎng)絡 類庫消息包狀態(tài)消息+ S t a t e+ X P os , Y P os , Z P os+ D ire c t ion+ S p e e d+ F ire+ L a t e n c y玩家創(chuàng)建消息+ X P os , Y P os , Z P os+ D ire c t ion玩家銷毀消息 第 13 頁 共 30 頁 類說明 類 說明 cApp 主類,包含了進入游戲,渲染游戲,添加網(wǎng)格對象等 cClient 客戶端類繼承與 cNetworkClient cFrustum 檢查多維數(shù)據(jù)集或矩形 CNodeTreeMesh 樹節(jié)點,包含一些對象 3D坐標 sCreatePlayerMessage 創(chuàng)建一個玩家消息 sDestroyPlayerMessage 摧毀一