游戏客户端编码-2

来源:互联网 发布:实施国家大数据战略 编辑:程序博客网 时间:2024/03/28 16:55
 
class CHallSocket 
{
public:
    
void requestLogon();          //请求登录
    void requestGameList();     //请求游戏列表
    void requestRoomList();     //请求某个游戏的房间列表
    void requestLoginGame();  //请求登录某个游戏的房间
   
    
void onrepLogon();            //大厅服务器  回复 请求登录
    void onrepGameList();       //大厅服务器  回复  游戏列表
    void onrepRoomList();       //大厅服务器  回复  某个游戏的房间列表
    void onLoginGame();         //大厅服务器  回复 登录某个游戏的房间

    
void setLogonDialog(CLogonDialog* pDlg); // 新增这个方法,与CLogonDialog通信
    void setHallDialog(CHallDialog* pDlg);        // 通过调用 pDlg 的方法,与 CHallDialog 通信

protected:
    
void onRecv();                  //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数
}
;

当 CHallSocket 需要与多一个窗体通信时,就需要加多一个 setXXXXDialog() 的函数, CHallSocket 与 窗体类关联太密切了,当界面改动时,免不了要修改 CHallSocket ,又要再重新测试。

于是把 CHallSocket 与 界面的通信做成了一个类,俗称“接口类”

class CHallSocketImpl
{
    
void onrepLogon() = 0;            //大厅服务器  回复 请求登录
    void onrepGameList() = 0;       //大厅服务器  回复  游戏列表
    void onrepRoomList() = 0;       //大厅服务器  回复  某个游戏的房间列表
    void onLoginGame() = 0;         //大厅服务器  回复 登录某个游戏的房间
}
;

把 CHallSocket 改成

class CHallSocket 
{
public:   
    
void requestLogon();          //请求登录
    void requestGameList();     //请求游戏列表
    void requestRoomList();     //请求某个游戏的房间列表
    void requestLoginGame();  //请求登录某个游戏的房间
   
    
void onrepLogon();            //大厅服务器  回复 请求登录
    void onrepGameList();       //大厅服务器  回复  游戏列表
    void onrepRoomList();       //大厅服务器  回复  某个游戏的房间列表
    void onLoginGame();         //大厅服务器  回复 登录某个游戏的房间

   
// 无论要和几个窗口通信,只需通过这个函数告诉 CHallSocket 就可以了,  当然, 这需要 CLoginDialog 和 CHallDialog 都 继承 CHallSocketImpl 类,并且实现类中的方法。
    void setSockImpl(CHallSocketImpl* pImpl);  
    
protected:
    
void onRecv();                  //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数

private:
    CHallSocketImpl
*    m_sockImpl;   // 通过 setSockImpl 赋值
}
;

窗体类:

class CLoginDialog : public CHallSocketImpl
{
    
void onrepLogon()  {/* 服务器返回登录结果的显示 */}            //大厅服务器  回复 请求登录

   
// 由于登录窗体并不显示 游戏列表,房间登录等信息,所以只实现了 onrepLogon 方法
   void onrepGameList() {}       //大厅服务器  回复  游戏列表
    void onrepRoomList() {}        //大厅服务器  回复  某个游戏的房间列表
    void onLoginGame()   {};       //大厅服务器  回复 登录某个游戏的房间
}


class CHallDialog : public CHallSocketImpl
{
       
// 同样道理,大厅窗体显示登录相关的信息,因为已经在登录窗体处理后,才进入大厅窗体的,故这里不实现     onrepLogon 方法
    void onrepLogon() {}            //大厅服务器  回复 请求登录

    
void onrepGameList()  /* 显示游戏列表操作 */ }       //大厅服务器  回复  游戏列表
    void onrepRoomList()  /* 显示游戏房间操作 */ }        //大厅服务器  回复  某个游戏的房间列表
    void onLoginGame()    /* 登录游戏显示操作 */ }        //大厅服务器  回复 登录某个游戏的房间
}

 在显示登录窗体之前通过调用

CHallSocket::setSockImpl(&CLoginDialog);       // 设置网络层要回调的接口.

在显示大厅窗体之前同样调用

CHallSocket::setSockImpl(&CHallDialog);  

这样做的好处,CHallSocket 并不关心它具体是与哪个窗体进行通信,它只知道与接口 CHallSocketImpl 通信就可以了,这样一来,只要网络通信流程不改变,无论要把整个登录游戏的过程分成多少个窗体来显示,都可以不用修改 CHallSocket 类,一来方便修改代码,二来也减少了出错的机会。   

 (未完,等续)

原创粉丝点击