cocos2dx使用lua和protobuf


 

為了使游戲開發更加方便快捷,我繼續了protobuf在lua下的嘗試。

 

socket使用的是cocos2dx集成的websocket。

 

先說下環境:cocos2d-x-2.2.1 + protobuf 2.5.0 + protoc-gen-lua + Python 2.7.5

 

 

 

1.在protobuf目錄下依次執行如下命令

 

 

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. python setup.py build  
  2. python setup.py install  


2.在protoc-gen-lua目錄下的plugin目錄中新建protoc-gen-lua.bat文件,並將如下內容粘貼到里面

 

 

 

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. @python <你的目錄>\protoc-gen-lua\plugin\protoc-gen-lua  


3.生成protobuf對應的lua文件,執行如下命令:

 

 

 

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. <你的路徑>/protoc.exe --lua_out=./ --plugin=protoc-gen-lua="<你的路徑>\protoc-gen-lua\plugin\protoc-gen-lua.bat" test.proto  

執行完后就會生成test_pb.lua文件。

 

 

4.使用cocos2dx的create_project.py創建lua工程;

 

5.將protoc-gen-lua/protobuf目錄下的pb.c文件復制到lua工程的Classes目錄下,並加入到C++工程中;

 

6.將protoc-gen-lua/protobuf目錄下的所有lua文件復制到lua工程的Resources目錄下;

 

7.編輯AppDelegate.cpp文件,添加如下代碼:

 

 

 

[cpp]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. extern "C"{    
  2. #include <lua.h>    
  3. #include <lualib.h>    
  4. #include <lauxlib.h>    
  5.     int luaopen_pb (lua_State *L);    
  6. }  


8.在AppDelegate::applicationDidFinishLaunching()方法中加入初始化方法:

 

 

 

 

[cpp]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. luaopen_pb(tolua_s);  


9.此時對lua工程進行編譯,如果出錯,請檢查並修正;編譯通過,並且可以正常運行后繼續下面的步驟;

 

 

10.cocos2dx默認產生的lua工程包含2個文件hello.lua與hello2.lua,打開hello2.lua,將如下內容添加到文件末尾(因為我使用的是websocket,各位可根據自己的實際情況進行修改):

 

 

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. local wsProtobuf=nil  
  2. function testProtobuf()  
  3.     wsProtobuf = WebSocket:create("ws://localhost:8080/web")  
  4.     local function onOpen(strData)  
  5.         print("socket open ...")  
  6.         require "test_pb"  
  7.         local msg=test_pb.Message()  
  8.         msg.id=101        
  9.         local person =test_pb.Person()  
  10.         person.id=111  
  11.         person.name="user1"  
  12.         person.email="a1@a.a"  
  13.         msg.data=person:SerializeToString()  
  14.         local pb_data = msg:SerializeToString()  
  15.         local t={string.byte(pb_data,1,-1)}  
  16.         wsProtobuf:sendBinaryMsg(t,table.getn(t))  
  17.     end  
  18.     local function onMessage(strData)  
  19.         print("socket message ...")  
  20.     end  
  21.     local function onClose(strData)  
  22.         print("socket close ...")  
  23.     end  
  24.     local function onError(strData)  
  25.         print("socket error")  
  26.     end  
  27.       
  28.     if nil ~= wsProtobuf then  
  29.         wsProtobuf:registerScriptHandler(onOpen,kWebSocketScriptHandlerOpen)  
  30.         wsProtobuf:registerScriptHandler(onMessage,kWebSocketScriptHandlerMessage)  
  31.         wsProtobuf:registerScriptHandler(onClose,kWebSocketScriptHandlerClose)  
  32.         wsProtobuf:registerScriptHandler(onError,kWebSocketScriptHandlerError)  
  33.     end   
  34. end  


11.然后在hello.lua中調用testProtobuf()函數即可。

 

 

測試運行,你可以在服務器端查看收到的消息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM