爲了使遊戲開發更加方便快捷,我繼續了protobuf在lua下的嘗試。javascript
socket使用的是cocos2dx集成的websocket。java
先說下環境:cocos2d-x-2.2.1 + protobuf 2.5.0 + protoc-gen-lua + Python 2.7.5python
1.在protobuf目錄下依次執行以下命令web
- python setup.py build
- python setup.py install
2.在protoc-gen-lua目錄下的plugin目錄中新建protoc-gen-lua.bat文件,並將以下內容粘貼到裏面服務器
- @python <你的目錄>\protoc-gen-lua\plugin\protoc-gen-lua
3.生成protobuf對應的lua文件,執行以下命令:websocket
- <你的路徑>/protoc.exe --lua_out=./ --plugin=protoc-gen-lua="<你的路徑>\protoc-gen-lua\plugin\protoc-gen-lua.bat" test.proto
執行完後就會生成test_pb.lua文件。app
4.使用cocos2dx的create_project.py建立lua工程;socket
5.將protoc-gen-lua/protobuf目錄下的pb.c文件複製到lua工程的Classes目錄下,並加入到C++工程中;函數
6.將protoc-gen-lua/protobuf目錄下的全部lua文件複製到lua工程的Resources目錄下;oop
7.編輯AppDelegate.cpp文件,添加以下代碼:
- extern "C"{
- #include <lua.h>
- #include <lualib.h>
- #include <lauxlib.h>
- int luaopen_pb (lua_State *L);
- }
8.在AppDelegate::applicationDidFinishLaunching()方法中加入初始化方法:
9.此時對lua工程進行編譯,若是出錯,請檢查並修正;編譯經過,而且能夠正常運行後繼續下面的步驟;
10.cocos2dx默認產生的lua工程包含2個文件hello.lua與hello2.lua,打開hello2.lua,將以下內容添加到文件末尾(由於我使用的是websocket,各位可根據本身的實際狀況進行修改):
- local wsProtobuf=nil
- function testProtobuf()
- wsProtobuf = WebSocket:create("ws://localhost:8080/web")
- local function onOpen(strData)
- print("socket open ...")
- require "test_pb"
- local msg=test_pb.Message()
- msg.id=101
- local person =test_pb.Person()
- person.id=111
- person.name="user1"
- person.email="a1@a.a"
- msg.data=person:SerializeToString()
- local pb_data = msg:SerializeToString()
- local t={string.byte(pb_data,1,-1)}
- wsProtobuf:sendBinaryMsg(t,table.getn(t))
- end
- local function onMessage(strData)
- print("socket message ...")
- end
- local function onClose(strData)
- print("socket close ...")
- end
- local function onError(strData)
- print("socket error")
- end
-
- if nil ~= wsProtobuf then
- wsProtobuf:registerScriptHandler(onOpen,kWebSocketScriptHandlerOpen)
- wsProtobuf:registerScriptHandler(onMessage,kWebSocketScriptHandlerMessage)
- wsProtobuf:registerScriptHandler(onClose,kWebSocketScriptHandlerClose)
- wsProtobuf:registerScriptHandler(onError,kWebSocketScriptHandlerError)
- end
- end
11.而後在hello.lua中調用testProtobuf()函數便可。
測試運行,你能夠在服務器端查看收到的消息。