游戏策划咨讯
做一个游戏并不难,难的是做一个好游戏;完美在于积累!
消息打包处理部分

续上在上面我简单的说了一下服务器完成端口处理部分,接下来我想大家介绍一下关于如何建立服务器和客户端的联系规则,也就是服务器和客户端的游戏协议部分。有不足之处希望大家和我进行交流。

首先解释一下这里协议的概念,协议大家都了解是一种通信规则,例如:TCP/IP,UDP等等,这些是我们在网络通信过程中所处理使用的协议。而我们这里的协议是我们的游戏服务器和客户端的通信规则。简而言之,也就是客户端发送到服务器的数据包和服务器发送的数据包双方解释规则。下面就通过几个部分来具体介绍这种协议的建立和处理。

消息头定义

如果我们能够解释双方的数据包的意义,我们就必须为双方数据包定义一个统一规则的消息头,我是这么定义消息头的。服务器数据包和客户端数据包分别定义不同的消息头。以下就是双方消息头的简单定义。

struct    ServerMsg_Head             //服务器消息头
{
   WORD  s_version;                //版本信息
   BYTE   s_flages;                 //消息标志
   BYTE   s_who;                  //消息驱动者
   BYTE   s_sort;                   //消息类别
   BYTE   s_value;                 //消息值
   WORD  s_len;                   //消息长度
} ;

struct    ClientMsg_Head             //客户端消息头
{
   WORD  c_version;                //版本信息
   WORD  c_flages                  //消息标志
   WORD  c_sort;                   //消息类别
   WORD  c_value;                  //消息值
   WORD  c_scene;                  //场景信息
   WORD  c_len;                    //消息长度
};

以上是我个人简单定义的消息头,具体的各个参数意义,就是需要规划设计的人来定了。这些我就不多说了。

在我们处理完我们的消息头后,我们就可以将我们的具体游戏数据进行打包。关于数据打包,我们必须要处理两件事情:数据打包,数据加密。为此我就建立相应的class来处理这样的一些操作。DataCtrl.h处理如下:

class  Ppackage类可以拆解为两个单独处理类,打包类和解包类。而此处我就用下面一个类来进行处理。只是给大家开个头,要设计的更好还是靠大家共同来进行斟酌呀!!


class   PPackage                                   //游戏数据包处理类
{
public:
PPackage(BYTE msg_type);                      //设置所打包消息类型
virtual ~PPackage();
//消息数据打包部分
void  SetMsgHead(void  *);                    //设置消息头
void  AddByte(BYTE  data);                   //加入一字节
void  AddWord(WORD  data);                 //加入二字节
void  AddDword(DWORD  data);               //加入四字节
void  AddPoint(POINT  data);                  //加入八字节
void  AddBuf(char * data ,int  data_len);          //加入多个字节
//消息内容获取
void  FinishPack();                            //完成打包
char  *GetPackage();                           //获取数据包
int   GetPacketLen();                          //获取数据包长度


//消息数据解包部分
void     SetMsgPackage(char *buf,int _Len);       //将获取消息进行录入
void    *GetMsgHead();                        //获取消息头数据
BYTE   GetByte();                            //获取一字节
WORD  GetWord();                            //获取二字节
DWORD GetDword();                           //获取三字节
POINT * GetPoint();                            //获取四字节
char  *  GetBuf(int buf_len);                    //获取多字节
bool     IfFinishGet();                         //是否完成解包

private: 

void     Init();
void     Release();
void     StartBindPakage();       //开始打包
void     StartUndoPackage();     //开始解包
    bool     MessageEncrypt();       //消息加密
    bool     MessageUndo();         //消息解密

private:

private:
    BYTE   msg_type;               / /{1-SERVER_PACKAGE=1,2-CLIENT_PACKAGE=2}
char  *  msg_buffer;
char  *  buffer;                 //后备缓冲区
int      msg_len;
//消息内容长度
Server_Msg_Head  msg_Head;     //消息头
int      buf_Len;
int      current_pos;             //指针的当前位置
protected:
};

以上就是关于服务器和消息打包类的一些建立和解释,这些方面知识其实也没有什么,主要是“仁者见仁,智者见智”了。而对于网络游戏的制作最重要的还是在于Game World的规划和设计,同时这个方面也是最难和最不好处理的。随后将和大家进行探讨。。

posted on 2005-02-13 11:51 蓝色雪焰 阅读(289) 评论(0)  编辑  收藏 所属分类: 网络游戏

只有注册用户登录后才能发表评论。


网站导航: