mvc框架弄完了,接下来开始做lua与原生的调用.
看了下博客,发现大部分人写tolua的内容,都是按照官方的教程走了一遍tolua,没有涉及到这个地方的作用,以及具体实现,我这篇文章会将binding的过程简化,详细解释使用方法,主要告诉大家我现在搭框架的时候,为什么会把这个东西列出来,先实现好.
本来想直接使用cocos本身自带的 lua调用oc lua调用java,我用了一下,发现接口太少,无法满足使用需求,所以还是传统的使用c++做中间层,然后实现调用原生.今天先做tolua,与oc 和 java调用也比较简单,后面有可能会去实现
为什么要从lua层调回原生层?
这里主要有一下几个原因:
1.在早几年,cocos没有得到各大厂商的重视,所以在其他SDK中,只有ios android 以及unity的接口实现,所以在cocos中,需要使用tolua达到调用原生,然后通过原生调用SDK的API.
2.还有一些程序需要将游戏其他功能模块封装到c++中,比如网络,IO等一系列功能
3.复杂的算法,之前有写过一个较为复杂的A*算法,在lua层的效率实在是无法接受,所以只能在c++来实现算法,将结果发给lua使用.
START:
- 找到目录 \frameworks\cocos2d-x\tools\tolua,打开README,里面有详细的说明
- 我这里是windows系统,之前用mac没有成功,各种奇葩问题,真的想骂娘,这里写几个重点,
- android-ndk-r16 一定要用这个!!!!!!
- python2.7.3 (32bit) 32位!!!!!!!!!!!
- pyyaml 以及 Cheetah 使用提供的下载链接下载
- `PYTHON_BIN` 就是python.exe的路径
其他就没什么了,跟着步骤走,改ini可以去别的博客看,没什么难度
开始看代码:
先说下大概情况:我这里只写了两个函数,
1.c++ 调用 lua
2.lua 调用 c++
只有这两个函数!!!!
这个跟个人喜好有关,有的人喜欢使用一个功能,就映射出一个方法,我的目的是达到快速开发,并且让其他程序无需操心这块内容,
所以只有两个基础方法,具体的功能模块,根据方法的参数(key)来区分,分别在c++或者lua中,做分类处理.这样做的好处就是,你在项目开始的时候 只需要实现过一次就好,不需要频繁的改动c++
c++ 代码:
XXToLua XXToLua::m_instance;
XXToLua::XXToLua()
{
}
string XXToLua::SendDataToLua(string _data)
{
log("CPlusSendDataToLua key:%s", _data.c_str());
auto engine = LuaEngine::getInstance();
engine->executeString("XXCPlusCall(\"123\")");
return "";
}
string XXToLua::GetDataByLua(string key,string _data)
{
log("SendDataToLua %s|%s",key.c_str(),_data.c_str());
SendDataToLua("789");
return "GetDataByLua";
}
XXToLua这个类为一个单例
SendDataToLua()
这个地方是使用cocos提供的函数,会调用lua的全局方法,达到c++调用lua
GetDataByLua()
这里是lua调用c++的方法,参数分别代表 类型以及数据,代码实现部分可以根据key的类型,做不同处理.
lua 代码:
local XXCPlusCall = function( msg )
XXLog(" XXCPlusCall------------> " .. msg)
end
local XXCallCPlus = function(_type,msg)
return XXToLua:getInstance():GetDataByLua(_type,msg)
end
cc.exports.XXCPlusCall = XXCPlusCall
怎么样 调用 和 接收 是不是都很简单, 其他具体业务逻辑,就可以单独封装下使用了,也保证了这块代码完全不涉及业务逻辑
简单说下这个地方可扩展的内容,就是这个数据参数,如果你的结构复杂,可以将这个string接收后,统一处理成字典,通过解析字符串转成字典,这样使用起来就会方便一些.
因为这里还没有做具体游戏,所以先简单实现功能,后面如果数据复杂我也会贴出encode,decode的代码.