2D网络游戏开发(网络篇)(九)
作者:akinggw
前言
转眼之间,就来到了这一系列教程的第九课来了,事先声明一下,这些文章大多来源于raknet的官方网站或者例程。如果你觉得我的文章有地方看不懂,那也请你原谅我,因为我也和你一样,也是重头学习这个函数库。在这种情况下,我还是请你阅读它官方网站上的。
比特流简介
在上一篇文章中,我们已经讲解了什么是数据包,也涉及到比特流,但一直没有对比特流进行详细地描述。而我们今天在讲解接收数据包之前,先简单地讲解一下比特流。
描述
bitstream 是名字空间Raknet下的一个类,它的作用就是对动态数组进行打包和解包bitsteam主要有三个优点:
1.
动态地建立数据包
2.
压缩
3.
写比特
要使用
bitsteam,
你必须首先预定义你的结构,并且把它们转换成
(char*)
形式。依赖与具体内容,你可以选择在运行的时候写数据块。
Bitstream
也可以根据数据包的类型进行压缩。
压缩采用下面的方法,比较的简单:
1.
上面的一半是否全是
0
(
1
表示无符号类型)?(译者注:不知道这里是否翻译正确,我也不明白,对不起哦)
TRUE –
写一个
1
FALSE -
上面的一半为
0
2
.重复那下面的一半,直到字节的一半
这意味着如果你的数据在它自己最大范围一半的情况下,你将保存比特流。这样你就可以用
WriteCompressed
来代替
Write
和用
ReadCompressed
来代替
Read
。
最后,你可以写比特。但大多数时间,你不会注意到这些。不管怎样,当写
bool
值时,将自动只写一个比特。这对你的数据的加密也很有用。
写数据
建立一个
bitstream
,然后为你的每个数据类型建立一个写方法。如果你的数据类型是
Raknet
中自带的,那么正确的重载函数将被调用。如果你的数据类型是你自己的类型,那么你必须向下面这样做。
BitStream.Write((char*)&myType,sizeof(myType);
这是构造函数中的一个带参数的版本。
读数据
读数据是同样简单。建立一个
bitstream
,然后在构造函数中将它指派给你的数据。
BitStream.myBitStream(packet->data,packet->length,false);
主要函数
构造函数
BitStream(int initialBytesToAllocate);
这个构造函数的作用是决定预先分配多少内存给这个
bitstream
。
构造函数
BitStream(const char* _data, unsigned int lengthInBytes,bool _copyData);
这个版本的构造函数是给
bitstream
一些初始数据。这通常用于将当前数据流解释成
bitstream,
最后一个参数
_copyData
如果为
false
,那么指针将指向当前的数据。如果为
true
,那么你可能想改变数据,想做一个内部的拷贝。
写数据函数
写数据函数用于在比特流结尾将数据变换成比特流,你将使用相反的方法
Read
将数读回来。
写压缩数据函数
就是将经过压缩后的数据写入
bitstream
,你同样可以使用相反的方法
ReadCompressed
将数据读回来。
读数据函数
read
数据函数用于按顺序从比特流中将数据读出来。如果在
bitsteam
中没有数据,就返回
false
。
读压缩数据函数
与前面相同,只不过是对压缩数据进行操作。
GetNumberOfBitsUsed
GetNumberOfBytesUsed
得到写入比特流的字节数或比特数。
GetData
给你一个指针,指向内部数据。可以让你直接访问数据。
Over!
结尾语
本来还打算讲解一下如何接收数据包,但我好想玩一下
3D
哦,大家就可怜可怜我,让我玩一下
3D
嘛
…..
不关它,先玩了再说。
关于更多内容请访问金桥科普网站(
http://popul.jqcq.com
)游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(
http://book.jqcq.com/category/1_70_740.html
)。
如果你在阅读本篇文章时有什么好的建议请来信给我,我的
E_mail: akinggw@126.com.
如果你在使用
SDL
时有什么问题,请到金桥科普网站(
http://popul.jqcq.com
)游戏开发栏目,我将详细地为你解答。