网上也由很多类似的Blog来介绍如何在Lua中使用自定义C++文件,但在具体操作时会遇到各种蛋疼的问题,在此把具体步骤以及要注意的地方一一记录,方便他人也方便自己。

最开始我也说明的是我所使用的是MAC机。

首先Quick-Cocos2d-x3.3Final中自带了绑定C++的文档frameworks/cocos2d-x/tools/tolua/README.mdown,里面有介绍关于如何绑定C++文件。

1、如果OS上没有装python,到http://brew.sh/,插入HomeBrew,也可以直接copy以下代码到终端执行:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  执行完之后,安装文档说明执行安装Python

brew install python

2、通过pip,安装Python的依赖。

首先插入pip

sudo easy_install pip

  如果是第一次需要提供账户密码。

插入pyyaml包,注意不要用sudo

pip install PyYAML

  如果后面的操作提示 no find yaml,执行:

pip uninstall PyYAML

  删除pyyaml,并重新执行插入pyyaml。

然后插入Cheetah:

sudo pip install Cheetah

3、尽管之前已经设置了NDK_ROOT路径,为了之后不必要的报错,这里还是要设置一下;同时也要重新设置PYTHON_BIN的路径。

如果采用默认的插入Python的方法,PYTHON_BIN=/usr/local/bin/python2.7,但也可能会不一样,还需要检查。

4、创建.ini文件,copy一份Cocos2d-x.ini,并重新命名为lua_custom_api.ini,修改其中内容:

[lua_custom_api]
prefix = lua_custom_api
target_namespace = 
headers = %(cocosdir)s/my/MyClass.h
classes = MyClass.*
skip = 
rename_functions = 
rename_classes = 
remove_prefix = 
classes_have_no_parents = 
base_classes_to_skip = 
abstract_classes =
假如我们创建了一个MyClass.h和MyClass.cpp,并放在了frameworks/cocos2d-x目录下的my下
target_namespaced是C++文件使用的命名空间,类似cc一样的东西。
具体参数的意义可以查看cocos2d-x.ini文件中得解释说明。
5、重新创建一个genbindings.py
由于我们只是新增加了C++文件,并没有改变Cocos2d-x代码,所以没必要再次绑定Cocos2d-x代码。进入目录frameworks/cocos2d-x/tools/tolua/,copy一份genbindings.py,并把命名为custom_genbindings.py
把其中的内容:
1         cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
 2                     'cocos2dx_assetsmanager.ini' : ('cocos2dx_assetsmanager', 'lua_cocos2dx_assetsmanager_auto'), \
 3                     'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
 4                     'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
 5                     'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
 6                     'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
 7                     'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
 8                     'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \
 9                     'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \
10                     'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \
11                     'cocos2dx_cocosbuilder.ini': ('cocos2dx_cocosbuilder', 'lua_cocos2dx_cocosbuilder_auto'), \
12                     'cocos2dx_cocosdenshion.ini': ('cocos2dx_cocosdenshion', 'lua_cocos2dx_cocosdenshion_auto'), \
13                     'cocos2dx_3d.ini': ('cocos2dx_3d', 'lua_cocos2dx_3d_auto'), \
14                     'cocos2dx_audioengine.ini': ('cocos2dx_audioengine', 'lua_cocos2dx_audioengine_auto'), \
15                     'cocos2dx_csloader.ini' : ('cocos2dx_csloader', 'lua_cocos2dx_csloader_auto'), \
16                     }

改变为:

1         cmd_args = {'lua_custom_api.ini' : ('lua_custom_api', 'lua_custom_api_auto'), \
2                     }

这样我们在执行./custom_genbindings.py时,只绑定我们自定义的C++文件。

6、进入目录frameworks/cocos2d-x/tools/tolua/,执行./custom_genbindings.py

cd frameworks/cocos2d-x/tools/tolua/
./custom_genbindings.py

一定要进入tolua目录,否则执行失败。

如果成功,会在cocos/scripting/lua-bindings/auto目录中生成lua_custom_api_auto.hpp/cpp两个文件,并在api目录中生成lua_custom_api_auto_api.lua说明文件。

7、引入lua_custom_api_auto

Xcode打开项目工程,选中cocos2d_lua_bindings项目工程,把lua_custom_api_auto.hpp/cpp这两个文件引入到auto目录下


打开Build Phases,把.cpp放到Complie Sources下,.hpp放到Headers下:


8、引入自定义的C++文件

选中cocos2d_libs工程,类似的把MyClass.h和MyClass.cpp文件引入进来。

9、使用自定义C++文件

打开我们项目的AppDelegate.cpp文件,把以下代码加入到合适的位置:

1     lua_State *state = stack->getLuaState();
2     lua_getglobal(state, "_G");
3     register_all_custom_api(state);
4     lua_pop(state, 1);

当然不要忘了把lua_custom_api_auto.hpp引入:

#include "lua_custom_api_auto.hpp"

重新编译cocos2d_lua_bindings、cocos2d_libs工程,至此就可以使用自定义的C++类了。