游戏开发(六) 之 quick-cocos2dx-lua使用Protobuf

继续开发基础功能:

此博客之后的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

  1. 先写示例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; // (可选的)
    }

     

  2. 使用工具生成lua文件:

  3. 因为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")

  4. 这里就是protobuf的使用

实际使用的时候有个地方,因为如果走http,那base里面的_type 可能就没有用了,因为可以根据协议去使用不同的结构体来解析,

当然看个人喜好你也可以继续使用,_ecode 字段是错误码使用,在收到base以后可以直接收到错误码信息,做相应处理,就不需要解析子结构了.

哦,有个东西要说下, 就是enum, 我之前是会根据协议名定义对应的枚举,但是之前的protolua那块 枚举有问题,不知道库为什么没有生成出来枚举的lua代码, 所以现在的版本就不准备用了

 

可以留言进行沟通和交流

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值