Lua调用自定义C++类
本文将详细介绍在 Windows 7 + VS2013 + Cocos Code IDE 环境下,使用 Cocos Code IDE 创建的 Lua 项目中,实现自定义 C++ 类绑定的具体步骤。
1. 放置自定义 C++ 代码
将自定义的 C++ 代码放置在 frameworks\runtime-src\Classes 目录下。当然,存放位置可以根据个人喜好进行调整,不过这里推荐放在 Classes 目录下,方便统一管理。
2. 添加自定义类的 .ini 文件
在 frameworks\cocos2d-x\tools\tolua 目录中,复制该文件夹下 cocos2dx.ini 的配置信息,然后根据自定义类的情况修改一些参数。以下是需要修改的参数配置:
[custom_api]
# prefix会被添加到生成的函数,你也可以选择不添加这个到你的模板
prefix = custom_api
# 所有的类都会嵌入到这个命名空间
target_namespace = my
# 类所在的路径,如果有多个,用空格隔开
headers = %(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h
# 需要注册的类,如果有多个,用空格隔开
classes = PanZoomLayer
# 不提供给Lua的public成员函数
skip = PanZoomLayer::[onTouchesBegan onTouchesMoved onTouchesEnded init onEnter onExit update]
# 这些参数保持为空即可
rename_functions =
rename_classes =
remove_prefix =
classes_have_no_parents =
base_classes_to_skip =
abstract_classes =
script_control_cpp = no
3. 在 genbindings.py 中添加自定义的配置 .ini
在 frameworks\cocos2d-x\tools\tolua 目录下的 genbindings.py 文件中,找到第 129 行的 cmd_args。将自定义的 custom_api.ini 添加进去,并注释掉其他 .ini 文件(这些文件已经不需要重新生成)。
4. 运行 genbindings.py 脚本
在终端运行 genbindings.py 脚本。为了方便操作,你可以直接编写一个批处理文件 .bat 来执行该脚本。需要注意的是,只要所需的工具都已下载、安装并正确配置,一般都能成功生成。如果生成失败,基本都是因为工具配置存在问题。
生成成功后,在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 目录中会找到生成的 C++ 桥接文件 lua_custom_api_auto.cpp 和 lua_custom_api_auto.hpp。其中,lua_custom_api_auto.hpp 中的 register_all_custom_api 函数是将 PanZoomLayer 类注册到 Lua 环境的关键函数。此外,在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 目录中也能找到提供给 Lua 调用的接口文件。
5. 编译并注册到 Lua
注册自定义类的函数可以在 lua_custom_api_auto.hpp 中找到,具体为 register_all_custom_api(lua_State* tolua_S)。接下来,使用 VS2013 打开 frameworks\runtime-src\proj.win32 目录下的工程,并按照以下步骤进行操作:
- 将自定义的类
PanZoomLayer添加到项目工程的Classes目录下。 - 将
lua_custom_api_auto.cpp和lua_custom_api_auto.hpp添加到工程liblua的auto目录下。 - 添加
lualib工程的文件搜索路径,将$(EngineRoot)../runtime-src/Classes路径添加进去。 - 编辑
frameworks\runtime-src\Classes目录下的入口类AppDelegate.cpp:- 添加
lua_custom_api_auto.hpp头文件。 - 注册
register_all_custom_api(state)函数。需要注意的是,register_all_custom_api函数上下的两句话必须添加。
- 添加
- 编译并运行整个项目,完成 C++ 类到 Lua 的注册。
完成以上步骤后,就可以在 Lua 中愉快地使用自定义的类了!