cocos2dx使用lua和protobuf

 

爲了使遊戲開發更加方便快捷,我繼續了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

 

 

 

[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文件,執行以下命令:
websocket

 

 

 

 

[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文件。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文件,添加以下代碼:

 

 

 

[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()函數便可。

 

 

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

相關文章
相關標籤/搜索