标签:
网上也由很多类似的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++类了。
标签:
原文地址:http://www.cnblogs.com/SouthRiver/p/4273029.html