传奇3客户端分析(一:g_xLoginProc游戏登录界面)
本系列文章为原创文章,本系列文章请在有一定编程基础下阅读,基础问题、语法问题将不做回答,如有转载,请注明出处。
在上节内容中,对WinMain函数进行了分析,大家可以看上节内容中有这么两个函数:
//登陆,人物选择,游戏过程部分
g_xClientSocket.m_pxDefProc = g_xMainWnd.m_pxDefProcess = &g_xLoginProc;//初始化Socket,这里不做研究
g_xLoginProc.Load();//CLoginProcess g_xLoginProc;
g_bProcState = _LOGIN_PROC;//程序当前的过程,做为后面消息循环里的判断过程的依据,也就是窗口重绘的依据。
我们来看看CLoginProcess是怎样定义的,通过分析发现他是基于CWHDefProcess的,那先看看CWHDefProcess
CWHDefProcess
{
public:
CWHDefProcess();
~CWHDefProcess();
VOID* m_pxDXGWnd;
HRESULT Clear(DWORD dwColor);
virtual VOID OnConnectToServer() = 0;
virtual char* OnMessageReceive(CHAR* pszPacketMsg) = 0;
virtual VOID ShowStatus(INT nStartX, INT nStartY);
//Default Message Process
virtual LRESULT DefMainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
CLoginProcess
2 {
3 public:
4 CWHWilImageData m_Image;
5 CWHWilImageData m_Image2;
6
7 // Public Functions
8 CLoginProcess();
9 virtual ~CLoginProcess();
10
11 VOID Init(VOID);
12 void Load(void);
13 VOID DeleteProc(VOID);
14 VOID SetNextProc(VOID);
15 VOID ReadIniFileData(VOID);
16 virtual LRESULT DefMainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
17
18 LRESULT OnWindowMove(WPARAM wParam,LPARAM lParam);
19 LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);
20 LRESULT OnLButtonUp(WPARAM wParam, LPARAM lParam);
21 LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam);
22 LRESULT OnButtonClick(WPARAM wParam,LPARAM lParam);
23 LRESULT OnMouseOn(WPARAM wParam,LPARAM lParam);
24 LRESULT OnKeyDown(WPARAM wParam,LPARAM lParam);
25 LRESULT OnEnterPressed(WPARAM wParam,LPARAM lParam);
26
27 VOID RenderIntro(INT nLoopTime);
28 VOID RenderScene(INT nLoopTime);
29 VOID RenderScroll(INT nLoopTime);
30 VOID RenderNewAccount(INT nLoopTime);
31 VOID RenderPatch(INT nLoopTime);
32 VOID RenderPassword(INT nLoopTime);
33 VOID RenderNewAccountHelpTxt(VOID);
34
35 virtual VOID OnConnectToServer();
36 virtual char* OnMessageReceive(CHAR* pszMessage);
37
38 private:
39 CLoginAvi m_xAvi; // Avi Degree
40 CLogin m_xLogin; // Login Degree
41 CSelectSrv m_xSelectSrv; // Select Server Degree
42
43 int m_nAnimationCounter;
44 int m_nServerPort;
45 int m_UserState;
46 int m_Progress;
47 CMirButton m_pBtn[6]; // LOGIN BUTTON
48
49 char m_szServerIP[15];
50 char m_szErrorMsg[512];
51 BOOL m_fIsConnected;
52 BOOL m_fIsLButtonClicked;
53 HBRUSH m_hBrush;
54
55 POINT m_MousePos;
56 UINT m_ButtonID;
57 SOCKADDR_IN m_LoginAddress;
58
59 CPDLList<ServerList> m_SList;
60 CPatch *pPatch;
61 CMirMsgBox3D m_xMsgBox;
62
63 VOID SetErrorMessage(INT nMsg,CHAR* szMgs); // Error Message.
64 VOID SetFocusBefore(VOID);
65 VOID SetFocusAfter(VOID);
66
67 BOOL CheckSSNO(char* szSSNo);
68 BOOL DateCehck(char* szDate);
69 BOOL IsLeapYear(int nYear);
70 BOOL CheckEMail(char* szEMail);
71
72 void OnSocketMessageRecieve(char *szMsg);
73
74 __inline BOOL IsInRect(int nPosX, int nPosY, RECT rc)
75 { if (nPosX >= rc.left && nPosX <= rc.right &&
76 nPosY >= rc.top && nPosY <= rc.bottom) return TRUE;
77 else return FALSE; }
78
79 BOOL StringDivideLen(INT nDivideLen, INT& nDividedLine, CHAR* szSrc,CDLList<CHAR*>* m_pxpStr);
80 };
因为不管传奇3还是传奇2,所有的图片都是在.wil文件里的,.wix为所引文件。其实大家看源码就知道了,里面其实都是跟创建一个窗口一样,一样有OnMouseMove、OnKeyDown等事件的,这些都不看了,咱就直接看CWHWilImageData和Load(),首先分析一下CWHWilImageData类。废话不多说,CWHWilImageData其实就是对wil进行解包,获取图片,这里就不详细解释了,自己分析一下客户端源码的这个类吧。因为WinMain函数里直接就是Load(),咋就看看Load()函数吧。通过对Load()的分析发现读取需要的图库,调整窗口位置,创建输入文本的对话框,创建LOGO动画、登录界面创建。进入消息循环,

浙公网安备 33010602011771号