继续开发基础功能:
此博客之后的cocos2dx 统一改成Quick-Cocos2dx-Community , 官方网址
这两天一直在搞 protobuf 的lua使用, 集成了很多次不同版本的,但是在android-build那块 不知道为什么一直不过,后来看了下 quick-lua 里面已经集成了protobuf,浪费了太多时间了,索性就换成 quick 吧
这里我整理了套protobuf的生成工具,自己写了个批处理,使用起来可以一步生成出:.cs .pb .lua 三个类型.
我服务器用的c#所以要一个.cs文件 , 客户端lua使用的是quick-lua提供的 protoc-gen-lua-bin , pb是给集成pbc的人使用的
继续说下 在cocos里面 lua 如何使用 protobuf
- 先写示例proto文件:base.proto和test.proto
//消息包 base.proto message base_message { required uint32 _type = 1; optional bytes _data = 2; optional uint32 _ecode = 3; }
//客户端->服务器 test.proto message c2s_test { required string arg1 = 1; // (必要的) optional string arg2 = 2; // (可选的) repeated string arg3 = 3; // 数组 } //服务器->客户端 message s2c_test { optional uint32 arg2 = 1; // (可选的) }
-
使用工具生成lua文件:
-
因为quick本身集成了protobuf,所以可以直接进行使用,不像其他的版本,需要自己引入库或者源文件
function MyApp:encodeProto() local baseMsg = base_pb.base_message() --base文件里的base_message 消息体 baseMsg._type = 1 --设置数据 local c2sMsg = test_pb.c2s_test() --test文件里的 c2s_test 消息体 c2sMsg.arg1 = "a1" c2sMsg.arg2 = "a2" c2sMsg.arg3:append("a31") --这里是数组的添加方法 c2sMsg.arg3:append("a32") c2sMsg.arg3:append("a33") local c2sData = c2sMsg:SerializeToString() --这里是对 c2s_test 结构体数据的编码 得到的是二进制 baseMsg._data = c2sData --可以看base的_data字段类型bytes , 可以将编码过的结构体数据,赋值到这里 return baseMsg:SerializeToString() --然后再次编码 发送给服务器 end
function MyApp:decodeClientData(_data) print("收到数据--------------") local recvData = base_pb.base_message() recvData:ParseFromString(_data) --使用base_message结构 解析二进制 local recvtestData = test_pb.c2s_test() recvtestData:ParseFromString(recvData._data) --使用s2c_test结构去解析 print( recvData._type ) print( recvtestData.arg1 ) print( recvtestData.arg2 ) for _,str in ipairs(recvtestData.arg3) do print( str ) end end
调用 然后输出打印:
print("111111111111111111111111") local sendData = self:encodeProto() self:decodeClientData(sendData) print("111111111111111111111111")
-
这里就是protobuf的使用
实际使用的时候有个地方,因为如果走http,那base里面的_type 可能就没有用了,因为可以根据协议去使用不同的结构体来解析,
当然看个人喜好你也可以继续使用,_ecode 字段是错误码使用,在收到base以后可以直接收到错误码信息,做相应处理,就不需要解析子结构了.
哦,有个东西要说下, 就是enum, 我之前是会根据协议名定义对应的枚举,但是之前的protolua那块 枚举有问题,不知道库为什么没有生成出来枚举的lua代码, 所以现在的版本就不准备用了
可以留言进行沟通和交流