cocos2d-x Lua绑定C++ 自定义类到Runtime(Lua-binding)
本文主要来自小塔博客这篇文章http://www.zaojiahua.com/binding-custom-classes.html 该文详细清晰地讲述cocos2d-x Lua的一个重要功能,就是Lua读取C++类,用C++类写lua不方便实现的功能,用lua来读取,但是该文是在xcode环境下讲述的,没有说VS怎么配置,其实都差不多,我就转来修改下
我们的需求是:在c++层定义了一些类,我们需要将这些类导出给Lua来使用,从而完成在c++层实现起来容易的需要,这个时候就需要将整个类作为模块导出。而Cocos2d-x正是采用的这种思想,将Cocos中的类导出供用户使用,而不是再写一套Lua代码,用户使用Cocos导出的这套接口,在Lua脚本层写游戏代码。为了更好的理解这部分的内容,可以先看一下在Lua中调用c++函数这篇博客,了解c++中调用Lua的机制。该博客中我们将c++中需要导出的函数放到了一个模块中,其中我们手动的做了一些工作。然而Lua的本质是C,不是C++,Lua提供给C用的API也都是基于面向过程的C函数来用的,要把C++类注册进Lua形成一个一个的table环境是不太容易一下子办到的事。为了实现我们的需求,同样也是官方的需求,在Cocos 2.x版本的时候,使用的是tolua++这个工具,但是这个工具用起来相当的麻烦,耗费体力,所以现在使用的是bindings-generator工具(官方用Python写的一个工具),这个东西底层使用的也应该是tolua++。 我没有使用过tolua++这个工具,不过从网上了解了一下这个工具的使用方法,大致是这样的:1、写自己的c++类,该怎么写就怎么写。2、根据需要导出的c++类的头文件写对应的.pkg文件,具体怎么写得参照tolua++格式。3、写一个桥接的类,只写它的头文件,cpp文件是使用tolua++工具来生成的,头文件具体怎么写,也是需要按照tolua++的格式。4、给这个桥接的类写一个.pkg文件。5、使用命令生成桥接类的.cpp文件。6、程序中使用桥接的类,执行一些先关的函数。所以如果使用的是tolua++工具的话,至少需要写三个文件,导出类的.pkg文件,桥接类的.h文件,桥接类的.pkg文件,可想而知还是比较麻烦的。现在好了,我们有了bindings-generator工具,下面就来具体的使用一下吧。 1、使用Cocos Code IDE建立一个Lua工程,我用的是2.0版,右击工程 Cocos Tool ->选中add native code这个选项,这样会在工程目录下生成frameworks这个文件夹,里边是c++层的代码。
2、进入到frameworks的工程目录下,打开对应的工程,我们用VS打开 3、在VS工程中我们写自己的类,这个类就是你要导出给Lua层用的接口,实际的需求可能是你一直在c++层写代码,某一部分的功能需要在Lua层来实现,这个时候有一些类需要导出给Lua使用,这里我们只是模拟一下,我们在Classes里写一个简单的TestLua类好了。 #ifndef __Test11__TestLua__ #define __Test11__TestLua__ #include "cocos2d.h" USING_NS_CC; class TestLua : public Ref { public: bool init(){return true;}; CREATE_FUNC(TestLua); int show(int); }; #endif /* defined(__Test11__TestLua__) */TestLua.h #include "TestLua.h" int TestLua::show(int arg) { log("xiaota show %d",arg); return arg+100; }TestLua.cpp 文件结构在VS像下图这个样子 然后进入tolua目录,原目录下只有genbindings.py,我把这个文件复制了一份命名为genbindings2.py,然后复制了一个cocos2dx.ini文件,重新命名为xiaota.ini。genbindings.py文件是一个Python脚本,这个脚本在执行的过程中会读取.ini的配置文件,然后根据这些个配置文件生成我们需要的桥接类。
经过这些步骤以后基本就算成功了,跑程序的时候我们使用这个最新的runtime,大家需要明确的一点是当我们改变c++层的代码的时候就需要重新build一下runtime,说白了就是重新编译一下c++的文件,让Lua脚本运行在一个新的环境下。 9. Cocos Code IDE Run菜单 -》edit configuration...来设一下新的Simulator10、最后一步,打开工程的main.lua,在工程中使用导出来的接口,最终来验证一下是否成功。 local function main() collectgarbage("collect") -- avoid memory leak collectgarbage("setpause",100) collectgarbage("setstepmul",5000) local val = tt.TestLua:create():show(10) print(val) end 一句话,不经历风雨,怎么见彩虹,经过了这么多步折腾,终于见到了成果,大家好好欣赏下吧,原来不用VS用Cocos Code IDE也是能绑定C++类的 大家找不到Cocos Code IDE 2.0的我分享下http://pan.baidu.com/s/1geyU3B1,此版本最好的地方是可以调试了不像1.0老是出问题,此版有一个重大BUG是代码编辑部分会突然变成插入状态不能编辑了 这时键盘按下 S键即可解决! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |