许多 Actionscript 程序员已经从 Flash 转到 Cocos2d-x 了。那么以前的那些超级好用的类库都不见了,只好重新来过。
我利用 Lua 和 lpack 库实现了一套 lua版本的 ByteArray 。这套库用于 quick-cocos2d-x(后称quick) 中。因此依赖一些 quick 中已经包含的c库和lua库 。
主要依赖如下:
- lpack (已经包含在quick中)
- BitOp (已经包含在quick中)
- quick framework
utils.ByteArray
ByteArray依赖 lpack 。
lpack 其实已经足够好用了。但是由于lpack的指针功能有限,所以使用起来还是有些麻烦。这个类模仿了 Actionscript 的 flash.utils.ByteArray ,指针在内部实现,方便读取和缓存 socket 服务器数据。
当然了,有一点点不同,但或许更好用。
下面是使用ByteArray的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
--
直接使用
lpack
库生成一个字节流
local
__pack
=
string
.
pack
(
"<bihP2"
,
0x59
,
11
,
1101
,
""
,
"中文"
)
--
创建一个
ByteArray
local
__ba
=
ByteArray
.
new
(
)
--
ByteArray
允许直接写入
lpack
生成的字节流
__ba
:
writeBuf
(
__pack
)
--
不要忘了,
lua数组是
1基的。而且函数名称比
position
短
__ba
:
setPos
(
1
)
--
这个用法和
AS3相同了,只是有些函数名称被我改掉了
print
(
"ba.len:"
,
__ba
:
getLen
(
)
)
print
(
"ba.readByte:"
,
__ba
:
readByte
(
)
)
print
(
"ba.readInt:"
,
__ba
:
readInt
(
)
)
print
(
"ba.readShort:"
,
__ba
:
readShort
(
)
)
print
(
"ba.readString:"
,
__ba
:
readStringUShort
(
)
)
print
(
"ba.available:"
,
__ba
:
getAvailable
(
)
)
--
自带的
toString方法可以以
10进制、
16进制、
8进制打印
print
(
"ba.toString(16):"
,
__ba
:
toString
(
16
)
)
--
创建一个新的
ByteArray
local
__ba2
=
ByteArray
.
new
(
)
--
和
AS3的用法相同,还支持链式调用
__ba2
:
writeByte
(
0x59
)
:
writeInt
(
11
)
:
writeShort
(
1101
)
--
写入空字符串
__ba2
:
writeStringUShort
(
""
)
--
写入中文(
UTF8)字符串
__ba2
:
writeStringUShort
(
"中文"
)
--
十进制输出
print
(
"ba2.toString(10):"
,
__ba2
:
toString
(
10
)
)
|
下面就是效果了:
utils.ByteArrayVarint
ByteArrayVarint 继承 ByteArray,同时依赖 BitOp。
ByteArrayVarint 实现了 google protocol buffer协议中的Varint编码 。
Protocol Buffer协议是何方神圣,google一下就知道。简单说就是能大幅降低 socket 协议中传递的字节流的长度。但是protocol buffer协议还包含许多东西,而我只需要 varint 编码而已。
我们的上一个游戏就在 AS3中实现了varint编码 。现在又用lua实现了一遍。
方法名称 | 说明 |
---|---|
ByteArrayVarint.readUVInt() | read a unsigned varint int |
ByteArrayVarint.writeUVInt() | write a unsigned varint int |
ByteArrayVarint.readVInt() | read varint int |
ByteArrayVarint.writeVInt() | write varint int |
ByteArrayVarint.readStringUVInt() | read a string preceding a unsigned varint int |
ByteArrayVarint.writeStringUVInt() | write a string preceding a unsigned varint int |
虽然lua支持64位数字,但由于 BitOp 仅支持32位有符号整数,这个 ByteArrayVarint 类能做的事情有限,甚至比AS3的都要差点(AS3好歹还支持32位无符号整数)。但如果程序中不使用变态的64位(或更高)数字的话,还是挺好的。
我会把常用的 lua 功能写出来整合在这个库里并开源,就像我的 as3库 和 java库 一样。