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

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

他在

  1. cocos2d-x\tools\simulator\libsimulator\lib\protobuf-lite

在这里目录下面有个

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

下载版本。

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

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

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

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

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

  1. protoc.exe MsgProtocol.proto --cpp_out=./
  2. pause

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

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

  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. enum MsgStatus {
  15. MsgStatus_NONE = 0;
  16. MsgStatus_ONE  = 1;
  17. MsgStatus_TWO  = 2;
  18. }
  19. optional MsgType msg = 5;
  20. optional MsgStatus status = 6;
  21. }

第七,写完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目录下),内容如下:

  1. #ifndef PBC_LUA_H
  2. #define PBC_LUA_H
  3. //
  4. //  pbc-lua.h
  5. //  pbc
  6. //
  7. //  Created by ArcherPeng on 15/7/21.
  8. //  Copyright (c) 2015年 ztgame. All rights reserved.
  9. //
  10. #if defined(_USRDLL)
  11. #define LUA_EXTENSIONS_DLL     __declspec(dllexport)
  12. #else         /* use a DLL library */
  13. #define LUA_EXTENSIONS_DLL
  14. #endif
  15. #if __cplusplus
  16. extern "C" {
  17. #endif
  18. #include "lauxlib.h"
  19. int LUA_EXTENSIONS_DLL luaopen_protobuf_c(lua_State *L);
  20. #if __cplusplus
  21. }
  22. #endif
  23. #endif/* pbc_pbc_lua_h */

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

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #include "lua.h"
  5. #include "lualib.h"
  6. #include "lauxlib.h"
  7. #include "pbc.h"
  8. #include "pbc-lua.h"//引入刚刚创建的头文件
  9. #ifdef __cplusplus
  10. }
  11. #endif

第四:

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

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

第五:

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

  1. bool AppDelegate::applicationDidFinishLaunching()
  2. {
  3. // set default FPS
  4. Director::getInstance()->setAnimationInterval(1.0 / 60.0f);
  5. // register lua module
  6. auto engine = LuaEngine::getInstance();
  7. ScriptEngineManager::getInstance()->setScriptEngine(engine);
  8. lua_State* L = engine->getLuaStack()->getLuaState();
  9. lua_module_register(L);
  10. luaopen_protobuf_c(L);//在lua中注册Proto函数
  11. register_all_packages();
  12. LuaStack* stack = engine->getLuaStack();
  13. stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));
  14. if (engine->executeScriptFile("src/main.lua"))
  15. {
  16. return false;
  17. }
  18. return true;
  19. }

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

  1. static int readProtobufFile(lua_State *L)
  2. {
  3. const char *buff = luaL_checkstring(L, -1);
  4. Data data = CCFileUtils::getInstance()->getDataFromFile(buff);
  5. lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());
  6. return 1; /* number of results */
  7. }

并将该函数注册到lua中,在staticint register_all_packages()中添加如下语句:

  1. // If you want to use packages manager to install more packages,
  2. // don't modify or remove this function
  3. static int register_all_packages()
  4. {
  5. lua_State *L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
  6. luaopen_protobuf_c(L);
  7. lua_register(L,"readProtobufFile",readProtobufFile);
  8. return 0; //flag for packages manager
  9. }

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

第八:

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

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

第九:

在LUA中Protobuf的简单例程:

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

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

MsgProtocol.proto的内容:

  1. message Person {
  2. required string name = 1;
  3. required int32 id = 2;
  4. optional string email = 3;
  5. enum PhoneType {
  6. MOBILE = 0;
  7. HOME = 1;
  8. WORK = 2;
  9. }
  10. message PhoneNumber {
  11. required string number = 1;
  12. optional PhoneType type = 2 [default = HOME];
  13. }
  14. repeated PhoneNumber phone = 4;
  15. }
  16. message AddressBook {
  17. repeated Person person = 1;
  18. }

需要生成.pb文件的话,你利用前面C++的集成方法生成:protoc.exe,.bat文件生成即可

注。这里需要生成的是pb文件,所以.bat的内容需要修改一下:
  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)

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := cocos2dlua_shared
  4. LOCAL_MODULE_FILENAME := libcocos2dlua
  5. FILE_LIST := hellolua/main.cpp
  6. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)
  7. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/lua/*.cpp)
  8. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/socket/*.cpp)
  9. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/hotUpdate/*.cpp)
  10. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/ide-support/*.cpp)
  11. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/ide-support/*.c)
  12. #添加
  13. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/pbc/binding/lua/*.c)
  14. FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/pbc/src/*.c)
  15. LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
  16. #你的工程目录
  17. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
  18. #你的工程目录其他自文件夹目录
  19. LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/pbc
  20. LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/pbc/src
  21. # _COCOS_HEADER_ANDROID_BEGIN
  22. # _COCOS_HEADER_ANDROID_END
  23. LOCAL_STATIC_LIBRARIES := cocos2d_lua_static
  24. LOCAL_STATIC_LIBRARIES += cocos2d_simulator_static
  25. # _COCOS_LIB_ANDROID_BEGIN
  26. # _COCOS_LIB_ANDROID_END
  27. include $(BUILD_SHARED_LIBRARY)
  28. $(call import-module,scripting/lua-bindings/proj.android)
  29. $(call import-module,tools/simulator/libsimulator/proj.android)
  30. # _COCOS_LIB_IMPORT_ANDROID_BEGIN
  31. # _COCOS_LIB_IMPORT_ANDROID_END

【转】 cocos2dx 3.x C++搭建protobuf环境的更多相关文章

  1. cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行

    首先第一篇,想学cocos2dx第一步就是搭建环境,第一步搭建不了环境,创建不了工程那一切都是扯淡. 说到mac下安装cocos2d-x想到的模式就是xcode+cocos2d-x.因为我本身就是一个 ...

  2. cocos2d-x 3.x丨搭建Android环境下的开发环境

    所需要的一些工具软件: 1.JDK  官网下载地址:http://www.oracle.com/ttechnetwork/java/javase/downloads/index.html 2.Andr ...

  3. cocos2dx 3.x以上版本搭建Mac环境(百分百可行)

    近期由于工作的原因,有机会接触了游戏行业,说实话,本人学程序最原始的初衷就是想做游戏,于是就创建了一篇cocos2d-x的分类来记录我在学习cocos2d-x的成长过程. 首先第一篇,想学cocos2 ...

  4. 3、Cocos2dx 3.0游戏开发找小三之搭建开发环境

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27107295 搭建开发环境 使用 Cocos2d- ...

  5. Flume1 初识Flume和虚拟机搭建Flume环境

    前言:       工作中需要同步日志到hdfs,以前是找运维用rsync做同步,现在一般是用flume同步数据到hdfs.以前为了工作简单看个flume的一些东西,今天下午有时间自己利用虚拟机搭建了 ...

  6. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

  7. 搭建LNAMP环境(二)- 源码安装Nginx1.10

    上一篇:搭建LNAMP环境(一)- 源码安装MySQL5.6 1.yum安装编译nginx需要的包 yum -y install pcre pcre-devel zlib zlib-devel ope ...

  8. 搭建LNAMP环境(一)- 源码安装MySQL5.6

    1.yum安装编译mysql需要的包 yum -y install gcc-c++ make cmake bison-devel ncurses-devel perl 2.为mysql创建一个新的用户 ...

  9. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

随机推荐

  1. html5语义化标签——回顾

    html5 头部结构   <!doctype html>    <meta charset=“utf-8”/> <header></header> 页眉 ...

  2. awk分隔符

    最近需要检测日志,shell中用到了awk,因为分割条件不止一个,并且包括了中括号.在此记录一下关于多分隔符并且包含中括号的情况 awk -F'[=,]|[][]+' '{print $6}'

  3. haproxy+keepalived主备与双主模式配置

    Haproxy+Keepalived主备模式 主备节点设置 主备节点上各安装配置haproxy,配置内容且要相同 global log 127.0.0.1 local2 chroot /var/lib ...

  4. spring mvc中几种获取request对象的方式

    在使用spring进行web开发的时候,优势会用到request对象,用来获取访问ip.请求头信息等 这里收集几种获取request对象的方式 方法一:在controller里面的加参数 public ...

  5. javascript--鼠标拖拽窗口案例(鼠标按下,在鼠标移动过程中,盒子跟着一起移动,鼠标松开,盒子停止移动)

    界面如图所示: 要求:在“信息注册”栏,按下鼠标,然后鼠标在页面移动,在鼠标移动过程中,该窗口跟着鼠标移动,当鼠标松开的时候,窗口停止移动.点击“关闭”,该窗口隐藏. 实现思路: 1.页面结构分析:一 ...

  6. spring的事务处理

    说到事务,无非就是事务的提交commit和回滚rollback. 事务是一个操作序列,这些操作要么全部都执行成功,事务去提交,要么就是有一个操作失败,事务去回滚. 要知道事务的4大特性ACID.即原子 ...

  7. 第三章 最简单的C程序设计——顺序程序设计

    一.数据的表现形式及其运算 1.常量和变量 在计算机高级语言中,数据有两种表现形式:常量和变量. 1.1.常量 在程序运行过程中,其值不能被改变的量称为常量.如:5,6,32,0.111. 数值常量就 ...

  8. shell重温---基础篇(连接数据库)

    前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...

  9. LI 标签中让文章标题左对齐,日期右对齐的方法

    希望实现标题在左对齐,日期在右对齐,当直接给日期的span加上float:right时,IE8和FF都OK,但IE6/7则会换行,下面给出一个简单有效的解决办法. <!DOCTYPE html  ...

  10. 7 tftp

    1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...