为了使游戏开发更加方便快捷,我继续了protobuf在lua下的尝试。
socket使用的是cocos2dx集成的websocket。
先说下环境:cocos2d-x-2.2.1 + protobuf 2.5.0 +protoc-gen-lua +Python 2.7.5
1.在protobuf目录下依次执行如下命令
- pythonsetup.pybuild @H_502_25@pythonsetup.pyinstall
2.在protoc-gen-lua目录下的plugin目录中新建protoc-gen-lua.bat文件,并将如下内容粘贴到里面
- @python<你的目录>\protoc-gen-lua\plugin\protoc-gen-lua
3.生成protobuf对应的lua文件,执行如下命令:
- <你的路径>/protoc.exe--lua_out=./--plugin=protoc-gen-lua="<你的路径>\protoc-gen-lua\plugin\protoc-gen-lua.bat"test.proto
4.使用cocos2dx的create_project.py创建lua工程;
5.将protoc-gen-lua/protobuf目录下的pb.c文件复制到lua工程的Classes目录下,并加入到C++工程中;
6.将protoc-gen-lua/protobuf目录下的所有lua文件复制到lua工程的Resources目录下;
8.在AppDelegate::applicationDidFinishLaunching()方法中加入初始化方法:
- luaopen_pb(tolua_s);
9.此时对lua工程进行编译,如果出错,请检查并修正;编译通过,并且可以正常运行后继续下面的步骤;
10.cocos2dx默认产生的lua工程包含2个文件hello.lua与hello2.lua,打开hello2.lua,将如下内容添加到文件末尾(因为我使用的是websocket,各位可根据自己的实际情况进行修改):
- localwsProtobuf=nil @H_502_25@functiontestProtobuf()
- wsProtobuf=WebSocket:create("ws://localhost:8080/web") @H_502_25@localfunctiononOpen(strData)
- print("socketopen...") @H_502_25@require"test_pb"
- localmsg=test_pb.Message() @H_502_25@msg.id=101
- localperson=test_pb.Person() @H_502_25@person.id=111
- person.name="user1" @H_502_25@person.email="a1@a.a"
- msg.data=person:SerializeToString() @H_502_25@localpb_data=msg:SerializeToString()
- localt={string.byte(pb_data,1,-1)} @H_502_25@wsProtobuf:sendBinaryMsg(t,table.getn(t))
- end @H_502_25@localfunctiononMessage(strData)
- print("socketmessage...") @H_502_25@end
- localfunctiononClose(strData) @H_502_25@print("socketclose...")
- end @H_502_25@localfunctiononError(strData)
- print("socketerror") @H_502_25@end
- @H_502_25@ifnil~=wsProtobufthen
- wsProtobuf:registerScriptHandler(onOpen,kWebSocketScriptHandlerOpen) @H_502_25@wsProtobuf:registerScriptHandler(onMessage,kWebSocketScriptHandlerMessage)
- wsProtobuf:registerScriptHandler(onClose,kWebSocketScriptHandlerClose) @H_502_25@wsProtobuf:registerScriptHandler(onError,kWebSocketScriptHandlerError)
- end @H_502_25@end