基于Quick-Cocos2dx-Community3.6.2(编译运行我就不多说,有需要可以网上找下)
https://github.com/iTyran/Quick-Cocos2dx-Community
协议采用pbc:
https://github.com/cloudwu/pbc
简单介绍一下,这是云风开源的一套protobuf-lua库,用于数据的打包解包,相比protoc-gen-lua,个人觉得要好一些,常用的嵌套那些都支持,而另外一个还要修改代码支持且性能要差些,所以建议使用这个,云大同时也开发一个叫sproto的协议库,轻量,性能也好,只是相比protobuf没那么热门,这次还是选择主流,后面后机会,再写下。
由于这个git下面东西比较多,我把关键的我们客户端要用到的给拿出来了,这样方便使用,可以去这里取(有对lpeg这个正则库有依赖):
更新:
sproto:
https://github.com/cloudwu/sproto
也是需要lpeg依赖的,这个是我自己整理的,包含pbc和sproto,已经添加了lsproto.h头文件
http://pan.baidu.com/s/1kUIJ3r5
集成很简单,就两步(我已经为你准备好了最新的库,至少我认为是足够了):
1.把pbc和lpeg拷贝到(quick引擎目录/quick/lib/quick-src/lua_extensions目录下)
需要sproto则把sproto和lpeg保留并拷贝。
分平台做一些引入操作:
Android:
向Android.mk修改为以下内容,主要添加pbc、sproto和lpeg的编译文件。(避免新手问题我整个贴出来了,特别注意\号后面的内容不要带任何字符,不然会导致Android编译不过,对于仅仅想用一种协议,可以自行选择):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := lua_extensions_static
LOCAL_MODULE_FILENAME := libluaextensions
LOCAL_SRC_FILES := $(LOCAL_PATH)/lua_extensions_more.c \
$(LOCAL_PATH)/zlib/lua_zlib.c \
$(LOCAL_PATH)/filesystem/lfs.c \
$(LOCAL_PATH)/lpack/lpack.c \
$(LOCAL_PATH)/pbc/alloc.c \
$(LOCAL_PATH)/pbc/array.c \
$(LOCAL_PATH)/pbc/bootstrap.c \
$(LOCAL_PATH)/pbc/context.c \
$(LOCAL_PATH)/pbc/decode.c \
$(LOCAL_PATH)/pbc/map.c \
$(LOCAL_PATH)/pbc/pattern.c \
$(LOCAL_PATH)/pbc/proto.c \
$(LOCAL_PATH)/pbc/register.c \
$(LOCAL_PATH)/pbc/rmessage.c \
$(LOCAL_PATH)/pbc/wmessage.c \
$(LOCAL_PATH)/pbc/stringpool.c \
$(LOCAL_PATH)/pbc/varint.c \
$(LOCAL_PATH)/pbc/pbc-lua.c \
$(LOCAL_PATH)/lpeg/lpcap.c \
$(LOCAL_PATH)/lpeg/lpcode.c \
$(LOCAL_PATH)/lpeg/lpprint.c \
$(LOCAL_PATH)/lpeg/lptree.c \
$(LOCAL_PATH)/lpeg/lpvm.c \
$(LOCAL_PATH)/sproto/sproto.c \
$(LOCAL_PATH)/sproto/lsproto.c
LOCAL_SRC_FILES += \
$(LOCAL_PATH)/cjson/fpconv.c \
$(LOCAL_PATH)/cjson/lua_cjson.c \
$(LOCAL_PATH)/cjson/strbuf.c
ifeq ($(CC_USE_SQLITE),1)
LOCAL_SRC_FILES += \
$(LOCAL_PATH)/lsqlite3/sqlite3.c \
$(LOCAL_PATH)/lsqlite3/lsqlite3.c
endif
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ \
$(LOCAL_PATH)/cjson \
$(LOCAL_PATH)/zlib \
$(LOCAL_PATH)/debugger \
$(LOCAL_PATH)/filesystem \
$(LOCAL_PATH)/lpack \
$(LOCAL_PATH)/lsqlite3 \
$(LOCAL_PATH)/pbc \
$(LOCAL_PATH)/lpeg \
$(LOCAL_PATH)/sproto
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ \
$(LOCAL_PATH)/cjson \
$(LOCAL_PATH)/zlib \
$(LOCAL_PATH)/debugger \
$(LOCAL_PATH)/filesystem \
$(LOCAL_PATH)/lpack \
$(LOCAL_PATH)/lsqlite3 \
$(LOCAL_PATH)/pbc \
$(LOCAL_PATH)/lpeg \
$(LOCAL_PATH)/sproto \
$(COCOS2DX_ROOT)/cocos \
$(COCOS2DX_ROOT)/external/lua/luajit/include
include $(BUILD_STATIC_LIBRARY)
iOS:
这个很简单直接添加进项目就可以了。
对于模拟器,像这样子添加到项目,sproto操作一样:
而对于实际的ios项目,步骤跟上面一样,但是要勾选上target iOS:
lpeg引入也一样,然后再修改下lua_extensions_more.c(这里仅仅指出了修改的内容,可以看看我提供的文件)
// pbc
#include "pbc/pbc-lua.h"
// lpeg
#include "lpeg/lpcap.h"
#include "lpeg/lpcode.h"
#include "lpeg/lpprint.h"
#include "lpeg/lptree.h"
#include "lpeg/lptypes.h"
#include "lpeg/lpvm.h"
// sproto
#include "sproto/sproto.h"
#include "sproto/lsproto.h"
// sproto
{"sproto.core",luaopen_sproto_core},
// lpeg
{"lpeg", luaopen_lpeg}
// pbc
luaopen_protobuf_c(L); //pbc
2.编译我们的项目,把库的lua对应文件复制到我们的src目录。
这是我整理好的lualib,可以直接拿过去,test.lua文件都是可以删掉的,不过方便参考了。
更新带sproto:
http://pan.baidu.com/s/1nuZAziD
你可以直接拷贝我这个lualib到你的项目中,里面有相应的test文件,可以按照使用方法,写个Demo。
注意要添加一下搜索目录,以及引入正确,这个虽然简单如果没有经验的话还是会躺枪,一定要获取了writablePath,再组合文件夹路径作为搜索目录,不然Android下会搜索不到文件,这是我的经验,maybe can help you:
-- 添加搜索路径
local instFileUtils = cc.FileUtils:getInstance()
-- 添加资源目录默认搜索路径
local path = device.writablePath
instFileUtils:addSearchPath(path)
instFileUtils:addSearchPath(path.."res/")
instFileUtils:addSearchPath(path.."src/")
-- lib
instFileUtils:addSearchPath("src/lualib/lpeg/")
instFileUtils:addSearchPath("src/lualib/pbc/")
instFileUtils:addSearchPath("res/pb/")
-- 然后就可以这样引入了
require("protobuf")
local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("test.pb")
buffer = cc.FileUtils:getInstance():getDataFromFile(pbFilePath)
protobuf.register(buffer)
-- pbc 简单测试
local data = {}
data.id = 111111
data.name = "test hah"
local packet = protobuf.encode("MsgTest", data)
-- 在模拟器把packet tostring()会报错
-- NSConcreteAttributedString initWithString:: nil value
-- 然而这并没有什么影响,后面是可以decode出来的
-- print(tostring(packet))
print(string.format("packet => size: %s", #packet))
data = protobuf.decode("MsgTest", packet)
print(string.format("data => id: %s, num: %s", data.id, data.name))
-- sproto 简单测试
local sproto = require "sproto"
local core = require "sproto.core"
local sp = sproto.parse [[
.MsgTest {
id 0 : integer
name 1 : string
}
]]
local data = {}
data.id = 100000
data.name = "quinsm"
local packet = sp:encode("MsgTest", data)
print(string.format("packet => size: %s", #packet))
local data = sp:decode("MsgTest", packet)
print(string.format("data => id: %s, num: %s", data.id, data.name))
源码下载: http://pan.baidu.com/s/1o8aouuA
是不是很简单!其实集成这玩意儿并不难~只要多多尝试,现在我们客户端就已经做好了亲skynet屁股的准备,准备捂住你的鼻子。