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, -);
Data data = cocos2d::FileUtils::getInstance()->getDataFromFile(buff);
lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());
return ;
} TOLUA_API int register_pbc_module(lua_State* L)
{
lua_getglobal(L, "_G");
if (lua_istable(L, -))//stack:...,_G,
{
lua_register(L, "read_protobuf_file_c", read_protobuf_file);
luaopen_protobuf_c(L);
}
lua_pop(L, );
return ;
}

⑥在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 = ;
required int32 id = ;
optional string email = ; enum PhoneType {
MOBILE = ;
HOME = ;
WORK = ;
} message PhoneNumber {
required string number = ;
optional PhoneType type = [default = HOME];
} repeated PhoneNumber phone = ;
} message AddressBook {
repeated Person person = ;
}

③使用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 = ,
phone = {
{
number = ""
},
}
}) local slen = string.len(stringbuffer)
release_print("slen = "..slen) local temp = ""
for i=, 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

    http://www.cnblogs.com/chevin/p/6001872.html vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程 ...

  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. php中session同ip不同端口的多个网站session冲突的解决办法

    在局域网内使用IP加端口的访问方式搭了两个相同程序的站,结果发现用户在一个站下登录后,在另一个站也同时登录了,在一个退出后,另一个站也同时退出了.看了下程序发现两个站都是使用纯session方式记录登 ...

  2. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  3. Django Form&ModelForm

    ModelForm: 首先导入所需模块 from django.forms import ModelFormfrom django.forms import widgets as form_widge ...

  4. Nginx启动错误:error while loading shared libraries: libpcre.so.0

    今天测试的时候,启动一个其他机器预编译好的nginx到目标测试机器(OEL 7.4)启动的时候,报了下列错误: /usr/local/nginx/sbin/nginx: error while loa ...

  5. eclipse maven Errors while generating javadoc on java8

    With JDK 8, we are unable to get Javadoc unless your tool meets the standards of doclint. Some of it ...

  6. 通过注册表regedit对Windows回收站进行恢复

    误删资料恢复 一不小心,删错了,还把回收站清空了,咋办啊? 只要三步,你就能找回你删掉并清空回收站的东西 步骤: 1.单击"开始——运行,然后输入regedit(打开注册表) 2.依次展开: ...

  7. 零基础Python爬虫实现(爬取最新电影排行)

    提示:本学习来自Ehco前辈的文章, 经过实现得出的笔记. 目标网站 http://dianying.2345.com/top/ 网站结构 要爬的部分,在ul标签下(包括li标签), 大致来说迭代li ...

  8. Bugku-CTF之web基础$_POST

    Day4 web基础$_POST http://123.206.87.240:8002/post/ 本题要点: POST传参   打开发现这样一段代码  

  9. bzoj 2091 The Minima Game - 动态规划 - 博弈论

    题目传送门 需要验证权限的传送门 题目大意 Alice和Bob轮流取$n$个正整数,Alice先进行操作.每次每人可以取任意多的数,得分是这一次取的所有数中的最小值.Alice和Bob都足够聪明,他们 ...

  10. VC++ 使用CreateProcess创建新进程

    https://www.cnblogs.com/fancing/p/6477918.html #include <windows.h> #include <tchar.h> # ...