2D网络游戏开发(网络篇)(八)2

原创 2006年06月22日 11:44:00
#pragma pack(1)
struct C   //结构C的类型和结构A的类型一样
{
 A a;
 B b;
}
#pragma pack(1)
struct D      //结构C的类型和结构A的类型一样
{
B b;
A al
}
 
使用比特流来建立数据包
 
我们仍然使用上面的例子,但这次我们决定用比特流来重写他。我们有和前面相同的数据。
 
Unsigned char useTimeStamp; // 将这个分配给ID_TIMESTAMP
Unsigned long timestamp;   //把由getTime()返回的系统时间放在这里
Unsigned char typeId;      //这里将把一个数据类型添加到PacketEnumerations.h文件中,这里我们设置的是ID_SET_TIMED_MINE
UseTimeStamp=ID_TIMESTAMP;
TimeStamp=getTime();
TypeId=ID_SET_TIMED_MINE;
 
Bitstream myBitStream;
MyBitStream.Write(useTimeStamp);
MyBitStream.Write(timestamp);
MyBitStream.Write(typeId);
//假设我们有一个定义为Mine*mine对象
myBitStream.Write(mine->GetPosition().x);
myBitStream.Write(mine->GetPosition().y);
myBitStream.Write(mine->GetPosition().z);
myBitStream.Write(mine->GetID());    //在这个结构中,这是ObjectId 对象Id
myBitStream.Write(mine->GetOwner()); //在这个结构中,这是PlayerID,玩家Id
 
如果我们现在直接使用RakClient::SendRakServer::Send来发送我们的比特流将导致结构的混乱。现在让我们试着做一些改进。现在,假设我们玩家的坐标由于某种原因,在000,处。那么前面的代码将修改成下面的形式:
 
unsigned char useTimeStamp;             //分配这个到ID_TIMESTAMP
unsigned long timestamp;                //存储由函数getTime()返回的系统时间
unsigned char typeId;                   //分配一个类型到PacketEnumerations.h中,我们这里设置的是ID_SET_TIMED_MINE
useTimeStamp=ID_TIMESTAMP;
timestamp=getTime();
typeId=ID_SET_TIMED_MINE;
 
Bitstream myBitStream;
MyBitStream.Write(useTimeStamp);
MyBitStream.Write(timestamp);
MyBitStream.Write(typeId);
 
If(mine->GetPosition().x==0.0f && mine->GetPostion().y==0.0f && mine->GetPosition().z==0.0f)
{
 myBitStream.Write(true);
}
else
{
 myBitStream.Write(false);
 myBitStream.Write(mine->GetPosition().x);
 myBitStream.Write(mine->GetPosition().y);
 myBitStream.Write(mine->GetPositon().z);
}
myBitStream.Write(mine->GetID());     //在这个结构中,这是物体
myBitStream.Write(mine->GetOwner());   //在这个结构中,这是玩家
 
写字符流
 
通过重载BitStream,可以用数组来写字符流。一个方法是先写数据长度,然后再写数据,内容如下:
void WriteStringToBitStream(char *myString,BitStream *output)
{
 output->Write((unsigned short) strlen(myString));
 output->Write(myString,strlen(myString));
}
它们的编码是相同的,不管怎样,那不是很高效。Raknet有一个字符压缩类StringCompressor可以进行对字符串的压缩。如果我们想使用这个类来编码数据,可以写成下面的形式:
void WriteStringToBitStream(char *myString,BitStream *output)
{
 stringCompressor->EncodeString(myString,256,output);
}
 
你可以通过下面的形式将压缩的字符串解压出来。
 
Void WriteBitStreamToString(char *myString,BitStream *input)
{
 stringCompressor->DecodeString(myString,256,input);
}
 
在这里,256表示了最大的字节数。在编码过程中,如果你的字符串少于256个字节,那么将写那整个字符串。相反,如果你的字符串大于256个字节,那么就需要将它截断,然后在256个字节的数组中进行编码,当然包括终结符null
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 
 
 
 
 

2D网络游戏开发(网络篇)(一)

2D网络游戏开发(网络篇)(一) 来源: ChinaUnix博客  日期: 2006.05.26 11:16 (共有0条评论) 我要评论 作者:akinggw“2D网游开发”,我有时都觉得这个标题包含...

cocos2d-x商业级单机游戏和网络游戏开发系列

引言 接触coco2d-x已经一年多了,期间陆陆续续开发了很多的游戏,包括单机的小游戏和网络卡牌游戏。cocos2d-x是一个快速发展的引擎,除了经常的主引擎的更新之外,社区内也经常涌现出新的插件,...

Android网络游戏开发实战.part2

  • 2017年06月08日 12:56
  • 54.3MB
  • 下载

cocos2d-x 开发网络游戏(http post&socket)

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=274 最近开发...

3D网络游戏开发实践

  • 2010年05月26日 10:50
  • 182KB
  • 下载

Cocos2d-x开发网络游戏(四) 处理网络线程

转自:http://blog.sina.com.cn/s/blog_6084f58801014g0g.html

Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名主程)

如何做一名好主程

移动网络游戏实现流程 -- 基于Cocos2d-x引擎和pomelo服务器框架

一、pomelo在GitHub上各个项目间的关系 1、pomelo项目 pomelo项目是一个游戏服务器框架,用它可以创建服务器端项目。 2、chatofpomelo-w...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2D网络游戏开发(网络篇)(八)2
举报原因:
原因补充:

(最多只允许输入30个字)