cocos2d-x 2.x 与 cocos2d-x 3.x 差异(tolua++)
cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua环境里的,然而从cocos2d-x 3.x开始,用bindings-generator脚本代替了toLua++。
1、不用编写.pkg和.h文件了,直接定义一个 ini 文件, 注册到Lua环境 里的模块名是什么,就行了。
2、摸清了toLua++工具的生成方法,改由Python脚本动态分析C++类,自动生成桥接的.h和.cpp代码,不调用tolua++命令了
3、虽然不再调用tolua++命令了,但是底层仍然使用toLua++的库函数,比如tolua_function,bindings-generator脚本生成的代码就跟使用toLua++工具生成的几乎一样
接下来说怎么用bindings-generator脚本:
1、写自己的C++类,按照cocos2d-x的规矩,继承cocos2d::Ref类,以便使用cocos2d-x的内存回收机制。
2、编写一个.ini文件,让bindings-generator可以根据这个配置文件知道C++类该怎么暴露出来
3、修改bindings-generator脚本,让它去读取这个.ini文件
4、执行bindings-generator脚本,生成桥接C++类方法
5、用VS2012将自定义的C++类和生成的桥接文件加入工程,不然编译不到
6、修改AppDelegate.cpp,执行桥接方法,自定义的C++类就注册进Lua环境里了。
首先是自定义的C++类。我习惯将文件保存在 frameworks/runtime-src/Classes/ 目录下:
frameworks/runtime-src/Classes/MyClass.h
frameworks/runtime-src/Classes/MyClass.cpp
然后编写.ini文件。在frameworks/cocos2d-x/tools/tolua/目录下能看到genbindings.py脚本和一大堆.ini文件,这些就是bindings-generator的实际执行环境了。随便找一个内容比较少的.ini文件,复制一份,重新命名为MyClass.ini。大部分内容都可以凑合不需要改,这里仅列出必须要改的重要部分:
frameworks/cocos2d-x/tools/tolua/MyClass.ini
frameworks/cocos2d-x/tools/tolua/genbindings.py
(其实这一步本来是可以省略的,只要让genbindings.py脚本自动搜寻当前目录下的所有ini文件就行了,不知道将来cocos2d-x团队会不会这样优化)
至此,生成桥接文件的准备工作就做好了,执行genbindings.py脚本:
成功执行genbindings.py脚本后,会在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目录下看到新生成的文件:
注:若Python报错,看下是否缺少yaml、Cheetah包,若是,安装包就行了。
简单解释下编译成后lua_MyClass_auto.cpp
注册类:
绑定函数,要注意下:
从栈中弹出对象(其实是自定类的对象),接着把对象引用方法(包括含参数及handle)返回结果压栈,实现c、lua之间互相调用了。
2.编译运行
打开Classes/lua_module_register.h文件,添加头文件
若vs2012编译错误,估计都是没把源文件及生成的文件加入工程; 若有特殊处理,比如更换genbindings.py脚本生成文件路径,注意在vs2012环境->属性->c/c++->附加包含目录,添加路径。
lua代码:
编译运行:
-----------------------------------------------------------------------------------------------------------------------------
本文转自:http://blog.youkuaiyun.com/rexuefengye/article/details/46553239