zoukankan      html  css  js  c++  java
  • 【转】 cocos2dx 3.x C++搭建protobuf环境

    http://blog.csdn.net/ganpengjin1/article/details/50964961

    Cocos2dx 里面在网络游戏通信这一块一般我们都会采用protobuf来进行通信,cocos引擎没有集成C++的protobuf,那我们只能自己来集成了。因为protobuf有很多版本,那么我们怎么去下载与引擎中想对应的protobuf版本呢。

    他在

    [cpp] view plain copy
     
    1. cocos2d-x oolssimulatorlibsimulatorlibprotobuf-lite  

    在这里目录下面有个

    config.h文件,在第一行就可以看到当前版本,那我们就去http://code.google.com/p/protobuf/downloads/list  

    下载版本。

    第二,下载下来后,我们添加这个protobuf工程到你的项目工程中

    第三,右击你的项目,添加该protobuf为依赖项目,把cocos2d-x oolssimulatorlibsimulatorlibprotobuf-lite,这下面的google下面的protobuf文件夹全部删掉,替换成你解压后的src下面的google中的protobuf。config.h文件也替换成你的vsprojects下的config.h文件

    第四,开始编译--》应该是没有问题的

    第五,我们要开始生成我们的.proto文件了,怎么弄呢?还记得先前下载下来的protobuf文件吗?解压后,里面有个vsprojects 文件夹,protobuf.sln 用Vs打开这个工程编译protobuf工程,编译完之后,再编译test工程,这个时候会生成protoc.exe文件,这个文件就是我们所需要的。

    第六,我们开始编写我们的proto文件了,写一个.bat文件,内容:

    [cpp] view plain copy
     
    1. protoc.exe MsgProtocol.proto --cpp_out=./  
    2. pause  


    其中:***.proto为文件名, cpp为生成的C++文件,还可以生成其他:java, python等,但是暂时不支持lua的,out后面是路径,跟你的.proto文件是同一路径

    .proto文件中的内容可以直接定义message,例如:

    [cpp] view plain copy
     
    1. message Person {  
    2.     required int32 id = 1;  
    3.     required string name = 2;  
    4.     optional string emial = 3;  
    5.     optional string text = 4;  
    6.     enum MsgType {  
    7.         MsgType_None = 0;  
    8.         MsgType_ONE = 1;  
    9.         MsgType_TWO = 2;  
    10.         MsgType_THREE = 3;  
    11.         MsgType_FOUR = 4;  
    12.         MsgType_FIVE = 5;  
    13.     }  
    14.       
    15.     enum MsgStatus {  
    16.         MsgStatus_NONE = 0;  
    17.         MsgStatus_ONE  = 1;  
    18.         MsgStatus_TWO  = 2;  
    19.     }  
    20.   
    21.     optional MsgType msg = 5;  
    22.     optional MsgStatus status = 6;  
    23.       
    24. }  


    第七,写完bat,proto后,把.bat, protoc.exe, .proto文件复制到你项目目录下面(其实,任意位置都可以,只要这三个文件保持在同一目录就可以),运行.bat文件后,会成成.pb.cc,.pb.h文件,这个就是你生成的文件,把这两个文件复制到你的项目中,你就可以随意使用了。

    以上是C++集成protobuf。。

    下面来讲一下Lua集成Protobuf,先去下载pbc:https://github.com/cloudwu/pbc

    把这个项目下来,添加到你的项目工程中,然后编译一下。应该是编译没有问题的。接下来讲重要的部分:

    第一:右击的项目工程,把pbc添加为依赖项

    第二:在pbc工程里面创建一个头文件"pbc-lua.h"(最好放在工程的pbc目录下),内容如下:

    [cpp] view plain copy
     
    1. #ifndef PBC_LUA_H  
    2. #define PBC_LUA_H  
    3. //    
    4.   
    5. //  pbc-lua.h    
    6.   
    7. //  pbc    
    8.   
    9. //    
    10.   
    11. //  Created by ArcherPeng on 15/7/21.    
    12.   
    13. //  Copyright (c) 2015年 ztgame. All rights reserved.    
    14.   
    15. //    
    16.   
    17.   
    18.   
    19.   
    20. #if defined(_USRDLL)    
    21.   
    22. #define LUA_EXTENSIONS_DLL     __declspec(dllexport)    
    23.   
    24. #else         /* use a DLL library */    
    25.   
    26. #define LUA_EXTENSIONS_DLL    
    27.   
    28. #endif    
    29.   
    30.   
    31.   
    32. #if __cplusplus    
    33.   
    34. extern "C" {  
    35.   
    36. #endif    
    37. #include "lauxlib.h"  
    38.   
    39.   
    40.   
    41.     int LUA_EXTENSIONS_DLL luaopen_protobuf_c(lua_State *L);  
    42.   
    43.   
    44.   
    45. #if __cplusplus    
    46.   
    47. }  
    48.   
    49. #endif    
    50.   
    51.   
    52.   
    53. #endif/* pbc_pbc_lua_h */  


    第三:把binding/lua/pbc-lua.c (也放在工程的pbc目录下),代码如下:

    [cpp] view plain copy
     
    1. #ifdef __cplusplus    
    2.   
    3. extern "C" {    
    4.   
    5.     #endif    
    6.   
    7.     #include "lua.h"    
    8.   
    9.     #include "lualib.h"    
    10.   
    11.     #include "lauxlib.h"    
    12.   
    13.          
    14.   
    15.     #include "pbc.h"    
    16.   
    17.     #include "pbc-lua.h"//引入刚刚创建的头文件    
    18.   
    19.          
    20.   
    21.     #ifdef __cplusplus    
    22.   
    23. }    
    24.   
    25. #endif  


    第四:

    首先要修改pbc工程的头文件搜索路径:

    加入一条路径:项目路径/frameworks/cocos2d-x/external/lua/lua (这里最好使用相对路径,但绝对路径也可以)

    第五:

    添加完成后,回到AppDelegate.cpp中,引入头文件#include"pbc/pbc/pbc-lua.h",并在boolAppDelegate::applicationDidFinishLaunching()方法中加入luaopen_protobuf_c(L);用于将protobuf的函数注册进LUA,代码如下:

    [cpp] view plain copy
     
    1. bool AppDelegate::applicationDidFinishLaunching()    
    2.   
    3. {    
    4.   
    5.     // set default FPS    
    6.   
    7.     Director::getInstance()->setAnimationInterval(1.0 / 60.0f);    
    8.   
    9.         
    10.   
    11.     // register lua module    
    12.   
    13.     auto engine = LuaEngine::getInstance();    
    14.   
    15.     ScriptEngineManager::getInstance()->setScriptEngine(engine);    
    16.   
    17.     lua_State* L = engine->getLuaStack()->getLuaState();    
    18.   
    19.     lua_module_register(L);    
    20.   
    21.          
    22.   
    23.     luaopen_protobuf_c(L);//在lua中注册Proto函数    
    24.   
    25.          
    26.   
    27.     register_all_packages();    
    28.   
    29.      
    30.   
    31.     LuaStack* stack = engine->getLuaStack();    
    32.   
    33.     stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));    
    34.   
    35.          
    36.   
    37.     if (engine->executeScriptFile("src/main.lua"))    
    38.   
    39.     {    
    40.   
    41.         return false;    
    42.   
    43.     }    
    44.   
    45.          
    46.   
    47.     return true;    
    48.   
    49. }  

    第六:接下来我们要再为LUA注册一个函数用于读取pb文件数据:

    [cpp] view plain copy
     
    1. static int readProtobufFile(lua_State *L)    
    2.   
    3. {    
    4.   
    5.     const char *buff = luaL_checkstring(L, -1);    
    6.   
    7.     Data data = CCFileUtils::getInstance()->getDataFromFile(buff);    
    8.   
    9.     lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());    
    10.   
    11.     return 1; /* number of results */    
    12.   
    13. }  
    并将该函数注册到lua中,在staticint register_all_packages()中添加如下语句:

    [cpp] view plain copy
     
    1. // If you want to use packages manager to install more packages,     
    2.   
    3. // don't modify or remove this function    
    4.   
    5. static int register_all_packages()    
    6.   
    7. {    
    8.   
    9.     lua_State *L = LuaEngine::getInstance()->getLuaStack()->getLuaState();    
    10.   
    11.     luaopen_protobuf_c(L);    
    12.   
    13.          
    14.   
    15.     lua_register(L,"readProtobufFile",readProtobufFile);    
    16.   
    17.     return 0; //flag for packages manager    
    18.   
    19. }  

    第七:编译并运行,编译通过后,游戏运行成功!

    第八:

    至此,C++端设置完毕。但是并没有结束,还有最后几步。

    回到游戏项目的binding/lua目录,找到"protobuf.lua"文件,将其复制到lua项目的src目录下。


    第九:

    在LUA中Protobuf的简单例程:

    require "app/protobuf.lua" //导入你的protobuf.lua文件

    [cpp] view plain copy
     
    1. local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("app/MsgProtocol.pb")      
    2. release_print("PB file path: "..pbFilePath)      
    3.   
    4. local buffer = readProtobufFile(pbFilePath)      
    5. protobuf.register(buffer) --注:protobuf 是因为在protobuf.lua里面使用module(protobuf)来修改全局名字  
    6.   
    7. local stringbuffer = protobuf.encode("Person",      
    8.     {      
    9.         name = "Alice",      
    10.         id = 12345,      
    11.         phone = {      
    12.             {      
    13.                 number = "87654321"      
    14.             },      
    15.         }      
    16.     })      
    17.      
    18. local slen = string.len(stringbuffer)      
    19. local temp = ""      
    20. for i=1, slen do      
    21.     temp = temp .. string.format("0xX, ", string.byte(stringbuffer, i))      
    22. end      
    23. release_print(temp)      
    24. local result = protobuf.decode("Person", stringbuffer)      
    25. release_print("result name: "..result.name)  
    26. release_print("result name: "..result.id)  

    MsgProtocol.proto的内容:
    [cpp] view plain copy
     
    1. message Person {  
    2.   required string name = 1;  
    3.   required int32 id = 2;  
    4.   optional string email = 3;  
    5.   
    6.   enum PhoneType {  
    7.     MOBILE = 0;  
    8.     HOME = 1;  
    9.     WORK = 2;  
    10.   }  
    11.   
    12.   message PhoneNumber {  
    13.     required string number = 1;  
    14.     optional PhoneType type = 2 [default = HOME];  
    15.   }  
    16.   
    17.   repeated PhoneNumber phone = 4;  
    18. }  
    19.   
    20. message AddressBook {  
    21.   repeated Person person = 1;  
    22. }  
    需要生成.pb文件的话,你利用前面C++的集成方法生成:protoc.exe,.bat文件生成即可
    注。这里需要生成的是pb文件,所以.bat的内容需要修改一下:
    [cpp] view plain copy
     
    1. protoc.exe --descriptor_set_out=./MsgProtocol.pb ./MsgProtocol.proto  
    MsgProtocol 为你的pb文件名



    最后添加到android.mk里面,蛋疼啊。。。
     
    其实很简单的,只需要添加你的文件目录即可,用*.cpp或者*.c来搜索,这样实在是太方便了,省了很多事情,不再逐个逐个的添加(参考:http://blog.csdn.net/fu_zk/article/details/12836431)
    [cpp] view plain copy
     
    1. LOCAL_PATH := $(call my-dir)  
    2.   
    3. include $(CLEAR_VARS)  
    4.   
    5. LOCAL_MODULE := cocos2dlua_shared  
    6.   
    7. LOCAL_MODULE_FILENAME := libcocos2dlua  
    8.   
    9. FILE_LIST := hellolua/main.cpp    
    10. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)    
    11. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/lua/*.cpp)  
    12. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/socket/*.cpp)  
    13. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/hotUpdate/*.cpp)  
    14. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/ide-support/*.cpp)    
    15. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/ide-support/*.c)   
    16.   
    17. #添加    
    18. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/pbc/binding/lua/*.c)    
    19. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/pbc/src/*.c)    
    20.     
    21. LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)    
    22.   #你的工程目录  
    23. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes  
    24.   
    25. #你的工程目录其他自文件夹目录  
    26. LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/pbc    
    27. LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/pbc/src    
    28.   
    29. # _COCOS_HEADER_ANDROID_BEGIN  
    30. # _COCOS_HEADER_ANDROID_END  
    31.   
    32. LOCAL_STATIC_LIBRARIES := cocos2d_lua_static  
    33. LOCAL_STATIC_LIBRARIES += cocos2d_simulator_static  
    34.   
    35. # _COCOS_LIB_ANDROID_BEGIN  
    36. # _COCOS_LIB_ANDROID_END  
    37.   
    38. include $(BUILD_SHARED_LIBRARY)  
    39.   
    40. $(call import-module,scripting/lua-bindings/proj.android)  
    41. $(call import-module,tools/simulator/libsimulator/proj.android)  
    42.   
    43. # _COCOS_LIB_IMPORT_ANDROID_BEGIN  
    44. # _COCOS_LIB_IMPORT_ANDROID_END  


  • 相关阅读:
    Baum Welch估计HMM参数实例
    SVM 为什么要从原始问题变为对偶问题来求解
    Baum-Welch算法(EM算法)对HMM模型的训练
    LR采用的Sigmoid函数与最大熵(ME) 的关系
    01背包的常数优化的一点解释
    训练中文词向量
    TensorFlow L2正则化
    TensorFlow batch normalize的使用
    听说你的模型损失是NaN
    编译TensorFlow CPU指令集优化版
  • 原文地址:https://www.cnblogs.com/mimime/p/7649888.html
Copyright © 2011-2022 走看看