星之烁

星烁小屋

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

传奇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
class 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
 1 class CLoginProcess : public CWHDefProcess  
 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动画、登录界面创建。进入消息循环,

posted on 2011-01-03 16:51  星之烁  阅读(1279)  评论(0)    收藏  举报