先剖析壹下WindHorn工程。
1.CWHApp、CWHWindow和CWHDXGraphicWindow。Window程序窗口的創建。
CWHApp派生CWHWindow,CWHWindow又派生CWHDXGraphicWindow。CWHWindow類
中完成窗口的註冊和創建。CWHDXGraphicWindow調用CWHWindow完成創建窗口功能,然後再調用CreateDXG()來初始化DirectX。
2.CWHDefProcess派生出CloginProcess、CcharacterProcess、CgameProcess三個類。
這三個類是客戶端處理的核心類。
3. 全局變量:
CWHDXGraphicWindow g_xMainWnd; 主窗口類。
CLoginProcess g_xLoginProc; 登錄處理。
CCharacterProcess g_xChrSelProc; 角色選擇處理。
CgameProcess g_xGameProc; 遊戲邏輯處理。
4.代碼分析:
1.首先從LoginGate.cpp WinMain分析:
g_xMainWnd定義為CWHDXGraphicWindow調用CWHWindow完成創建窗口功能,然後
調用DirectDrawEnumerateEx枚舉顯示設備,(執行回調函數DXGDriverEnumCallbackEx) 再調用CreateDXG()來初始化DirectX(創建DirectDraw對象, 取得獨占和全屏模式, 設置顯示模式等)。
g_xSound.InitMirSound創建CSound對象。
g_xSpriteInfo.SetInfo();
初始化聲音,加載Socket庫之後,進行CWHDefProcess*指針賦值(事件綁定)。g_bProcState變量反應了當前遊戲的狀態(登錄,角色選擇,遊戲邏輯處理)。調用Load初始化壹些操作(登錄,角色選擇,遊戲邏輯處理)。進行消息循環。
case _LOGIN_PROC:
g_xLoginProc.RenderScene(dwDelay);
case _CHAR_SEL_PROC:
g_xChrSelProc.RenderScene(dwDelay);
case _GAME_PROC:
g_xGameProc.RenderScene(dwDelay);
根據g_bProcState變量標誌,選擇顯示相應的畫面。
2.接收處理網絡消息和接收處理窗口消息。
在不同的狀態下(登錄,角色選擇,遊戲邏輯處理),接收到的消息(網絡,窗口消息)會分派到不同的函數中處理的。這裏是用虛函數處理(調用子類方法,由實際的父類完成相應的處理)。
OnMessageReceive主要處理網絡消息。DefMainWndProc則處理窗體消息(按鍵,重繪等),創建窗體類為CWHDXGraphicWindow,回調函數為:
MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) [Page]
if ( m_pxDefProcess )
m_pxDefProcess->DefMainWndProc(hWnd, uMsg, wParam, lParam);
else
return MainWndProcDXG(hWnd, uMsg, wParam, lParam);
m_pxDefProcess->DefMainWndProc調用父類的實際處理。
在WM_PAINT事件裏: g_xClientSocket.ConnectToServer連接登陸服務器。