http://www.cnblogs.com/chevin/p/6001872.html

vs2013+cocos2dx 3.13.1

这篇博文是集成Lua版本的protobuf,集成C++版本的过程也可参考。

主要参考博文地址《cocos2dx 3.x C++搭建protobuf环境》,这里的集成方式和参考博文有点不一样(这里是直接集成到引擎中,参考博文是当成一个库放到项目中),请仔细甄别。

1.下载pbc

①下载地址 pbc:https://github.com/cloudwu/pbc

②解压后的文件列表,我们所需要的就是如下图的三个文件(夹)里的文件。(其中binding文件夹中包含了lua和lua53两个文件夹,因为cocos2dx集成的lua版本是5.1,所以我们使用lua文件夹,而不用lua53文件夹)

③其实就分两部分,一部分是C++部分(pbc.h和src文件夹),一部分就是C++绑定到lua部分(binding文件夹中lua文件夹)

2.将C++部分的代码集成到libcocos2d项目中

①在libcocos2d项目external文件夹中增加新的pbc文件夹,将pbc.h文件和src文件夹中的文件拷贝到里面去,并添加到项目中

②修改pbc.h文件

因为libcocos2d项目是一个dll项目,所以需要导出必要的函数让libluacocos2d项目进行调用,导出的函数前需要增加CC_DLL前缀。

首先include相应头文件,因为CC_DLL的定义在CCPlatformMacros.h中

然后给所有(所有!)函数前增加CC_DLL前缀,如下图只罗列了其中几个

③编译libcocos2d项目

3.将C++绑定到lua部分集成到libluacocos2d项目中

①在libluacocos2d项目中manual文件夹中增加新的pbc文件夹,并将pbc-lua.c文件拷贝(从bunding/lua中拷贝)进去,并新增(新增!)三个用于绑定的文件pbc-lua.h/lua_cocos2dx_pbc_manual.h/lua_cocos2dx_pbc_manual.cpp。如下图

②修改pbc-lua.c文件(只修改前面部分),入下图

③pbc-lua.h内容

#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h" #ifdef __cplusplus
}
#endif #ifdef __cplusplus
extern "C" {
#endif
int luaopen_protobuf_c(lua_State *L);
#ifdef __cplusplus
}
#endif

④lua_cocos2dx_pbc_manual.h内容

#pragma once

#ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif TOLUA_API int register_pbc_module(lua_State* L);

⑤lua_cocos2dx_pbc_manual.cpp内容

#include "scripting/lua-bindings/manual/pbc/lua_cocos2dx_pbc_manual.h"

#include "platform/CCPlatformConfig.h"
#include "base/ccConfig.h"
#include "scripting/lua-bindings/manual/tolua_fix.h"
#include "scripting/lua-bindings/manual/LuaBasicConversions.h"
#include "scripting/lua-bindings/manual/CCLuaEngine.h" #include "scripting/lua-bindings/manual/pbc/pbc-lua.h" #include "cocos/platform/CCFileUtils.h" int read_protobuf_file(lua_State *L){
const char *buff = luaL_checkstring(L, -1);
Data data = cocos2d::FileUtils::getInstance()->getDataFromFile(buff);
lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());
return 1;
} TOLUA_API int register_pbc_module(lua_State* L)
{
lua_getglobal(L, "_G");
if (lua_istable(L, -1))//stack:...,_G,
{
lua_register(L, "read_protobuf_file_c", read_protobuf_file);
luaopen_protobuf_c(L);
}
lua_pop(L, 1);
return 1;
}

⑥在cocos2d-x\cocos\scripting\lua-bindings\manual\lua_module_register.cpp中进行注册

⑦编译libluacocos2d项目

以上,lua的在项目中的集成就完成了。下面来进行lua项目的验证。

4.在lua项目中的使用

①在bunding/lua中拷贝两个文件parser.lua/protobuf.lua到lua项目src中,然后在init.lua中进行require。

②定义MsgProtocol.proto文件

message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3; enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
} message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
} repeated PhoneNumber phone = 4;
} message AddressBook {
repeated Person person = 1;
}

③使用protoc.exe(这个工具需要到protobuf官方网站下载或者编译得到 官网:https://github.com/google/protobuf/releases)生成MsgProtocol.pb文件

protoc.exe --descriptor_set_out=./MsgProtocol.pb ./MsgProtocol.proto

④将生成的MsgProtocol.pb放到资源res文件夹中!

⑤相关验证使用的Lua代码

local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("MsgProtocol.pb")
release_print("PB file path: "..pbFilePath) local buffer = read_protobuf_file_c(pbFilePath)
protobuf.register(buffer) --注:protobuf 是因为在protobuf.lua里面使用module(protobuf)来修改全局名字 local stringbuffer = protobuf.encode("Person",
{
name = "Alice",
id = 12345,
phone = {
{
number = "87654321"
},
}
}) local slen = string.len(stringbuffer)
release_print("slen = "..slen) local temp = ""
for i=1, slen do
temp = temp .. string.format("0xX, ", string.byte(stringbuffer, i))
end
release_print(temp)
local result = protobuf.decode("Person", stringbuffer)
release_print("result name: "..result.name)
release_print("result name: "..result.id)

⑥输出正确的结果

5.在windows上是能正确使用了,下面内容为修改mk文件,让protobuf在android上也能正常使用。

①修改libcocos2d项目对应的cocos2d-x\cocos\Android.mk文件,增加对应文件引用。

②修改libluacocos2d项目对应的cocos2d-x\cocos\scripting\lua-bindings\proj.android\Android.mk文件,增加对应文件引用。

③android上正常编译完成。

以上,完。

【转】cocos2dx 3.x 集成protobuf的更多相关文章

  1. cocos2dx 3.x 集成protobuf

    vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程也可参考. 主要参考博文地址<cocos2dx 3.x C++搭建protobuf环 ...

  2. cocos2d-x 3.1 集成 云风pbc

    cocos2d-x 3.x版本号变动比較大,从改用cmake管理整个项目,到使用python集成一体化的项目工具. 这些都是我喜欢的.我能够非常easy的在我的ubuntu上面搭建好开发环境,并且根本 ...

  3. cocos2d-x lua 中使用protobuf并对http进行处理

    cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链 ...

  4. cocos2dx使用lua和protobuf

    为了使游戏开发更加方便快捷,我继续了protobuf在lua下的尝试. socket使用的是cocos2dx集成的websocket. 先说下环境:cocos2d-x-2.2.1 + protobuf ...

  5. cocos2d-x C++ (Android)集成第三方微信分享

    ShareSDK Android for cocos2d-x 此文档为ShareSDK Android for cocos3.x的版本,如您集成的是2.X的版本文档请到这里:cocos2.x集成文档 ...

  6. [原创]COCOS2DX 3.8 增加protobuf为external库

    此处为记录防止忘记,最近使用COCOS练习一些新的库,所以需要把PROTOBUF编译进去,看上去很麻烦,这里记录一下,以防忘记. 首先下载protobuf 2.5.0版本,下载地址请自行百度. 准备工 ...

  7. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...

  8. 在Web Api中集成protobuf

    安装WebApiContrib.Formatting.ProtoBuf Install-Package WebApiContrib.Formatting.ProtoBuf 注册ProtoBufForm ...

  9. cocos2d-x C++ (iOS)集成第三方微信分享

    1.新建项目并下载 ShareSDK 1.Cocos2d-x项目环境搭建,不会的童鞋自行面壁哈: 网页链接. 2.ShareSDK iOS版本的 Cocos2d-x 插件是在ShareSDK iOS版 ...

随机推荐

  1. Javascript的加载

    最新博客站点:欢迎来访 1. 浏览器加载     (1) 同步加载 在网页中,浏览器加载js文件的方式是通过<script>标签.如下所示: //内嵌脚本 <script type= ...

  2. MySQL字段的属性应该尽量设置为NOT NULL

    数据库建表时,对于一些可填可不填的字段,我们应该尽量把它设置为 NOT NULL.这种做法即可以提高性能,又可以在很大程度上避免空指针类的问题,好处颇多. 1.节省空间 NULL 列需要更多的存储空间 ...

  3. webpack 之 webpack-dev-server自动刷新

    watch 首先介绍watch选项,参考这里.可实现相关源文件改变后自动更新bundle.js文件的功能.在配置文件中添加 watch:true 或执行 webpack -w,即可开启watch功能: ...

  4. 学习新框架laravel 5.6 (第二天)-DB,控制器及模型使用

    DB类使用,控制器使用及模型使用 链接数据库: /config/database.php /.env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=330 ...

  5. u-boot-2016.01移植(一)

    1.了解uboot: 阅读uboot源码顶层目录下的README.TXT可以提取如下信息:     made to support booting of Linux images.   //引导内核程 ...

  6. 数据分析处理库Pandas——索引进阶

    Series结构 筛选数据 指定值 备注:查找出指定数值的索引和数值. 逻辑运算 备注:查找出值大于2的数据. 复合索引 DataFrame结构 显示指定列 筛选显示 备注:值小于0的显示原值,否则显 ...

  7. Linux命令备忘录:quota显示磁盘已使用的空间与限制

    quota命令用于显示用户或者工作组的磁盘配额信息.输出信息包括磁盘使用和配额限制. 语法 quota(选项)(参数) 选项 -g:列出群组的磁盘空间限制: -q:简明列表,只列出超过限制的部分: - ...

  8. POJ1985 树的直径(BFS

    Cow Marathon   Description After hearing about the epidemic of obesity in the USA, Farmer John wants ...

  9. java第二章 变量和运算符

      Java 基础应用编程——  变量和运算符 1.Java程序结构          数据类型:确定要存储在内存中的数据的类型.          变量:是存储数据的基本单元 2.变量的概念   变 ...

  10. linux c fprintf()

    #include<stdio.h> #include<unistd.h> #include<time.h> int main(int argc,char *argv ...