In fact, this article is not written by me. It is an excellent post I saw on cocoachina. It feels like perfect, then I want to copy it, and then ...... Pack B. Hey, please don't be angry. This time is not used as an example.
I wrote a method to export the class to lua using the tool 3.0 to automatically generate code.
In the past, to export the c ++ class to lua, you had to manually maintain the pkg file, which is a nightmare. After 3.0, you will feel that life is easy.
Next I will discuss the specific practices.
1. Install the necessary libraries and toolkit, and configure the relevant environment variables, please follow the cocos2d-x-3.0rc0 \ tools \ tolua \ README. mdown To Do, Do not repeat.
2, write c ++ class (I tested using cocos2d-x-3.0rc0 \ tests \ lua-empty-test \ project \ Classes \ HelloWorldScene. cpp)
3. Write a generated python script. You won't write it. It doesn't matter. We will show it as a cat or a tiger.
1) enter the directory cocos2d-x-3.0rc0 \ tools \ tolua, copy a copy of genbindings. py, named genbindings_myclass.py
2) Create the generated directory in our project, open genbindings_myclass.py and
output_dir='%s/cocos/scripting/lua-bindings/auto' % project_root
?
Change
output_dir='%s/tests/lua-empty-test/project/Classes/auto'% project_root
3) modify the command parameters and set
cmd_args={'cocos2dx.ini': ('cocos2d-x','lua_cocos2dx_auto'), \ 'cocos2dx_extension.ini': ('cocos2dx_extension','lua_cocos2dx_extension_auto'), \ 'cocos2dx_ui.ini': ('cocos2dx_ui','lua_cocos2dx_ui_auto'), \ 'cocos2dx_studio.ini': ('cocos2dx_studio','lua_cocos2dx_studio_auto'), \ 'cocos2dx_spine.ini': ('cocos2dx_spine','lua_cocos2dx_spine_auto'), \ 'cocos2dx_physics.ini': ('cocos2dx_physics','lua_cocos2dx_physics_auto'), \ }
Change
cmd_args={'myclass.ini': ('myclass','lua_myclass_auto') }
4) at this time, you may ask where myclass. ini is. Let's write this file. The same principle is true. I still use cocos2dx_spine.ini to change it.
[myclass]# the prefix to be added to the generated functions. You might or might not use this in your own# templatesprefix = myclass # create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)# all classes will be embedded in that namespacetarget_namespace = android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/includeandroid_flags = -D_SIZE_T_DEFINED_ clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include clang_flags = -nostdinc -x c++ -std=c++11 cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/2d -I%(cocosdir)s/cocos/base -I%(cocosdir)s/cocos/ui -I%(cocosdir)s/cocos/physics -I%(cocosdir)s/cocos/2d/platform -I%(cocosdir)s/cocos/2d/platform/android -I%(cocosdir)s/cocos/math/kazmath -I%(cocosdir)s/extensions -I%(cocosdir)s/external -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s cocos_flags = -DANDROID -DCOCOS2D_JAVASCRIPT cxxgenerator_headers = # extra arguments for clangextra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s # what headers to parseheaders = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.h # what classes to produce code for. You can use regular expressions here. When testing the regular# expression, it will be enclosed in "^$", like this: "^Menu*$".classes = HelloWorld # what should we skip? in the format ClassName::[function function]# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just# add a single "*" as functions. See bellow for several examples. A special class name is "*", which# will apply to all class names. This is a convenience wildcard to be able to skip similar named# functions from all classes. skip = rename_functions = rename_classes = # for all class names, should we remove something when registering in the target VM?remove_prefix = # classes for which there will be no "parent" lookupclasses_have_no_parents = # base classes which will be skipped when their sub-classes found them.base_classes_to_skip = Ref ProcessBase # classes that create no constructor# Set is special and we will use a hand-written constructorabstract_classes = # Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.script_control_cpp = no
Pay attention to these lines when you change them.
[myclass]prefix = myclasstarget_namespace =headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.hclasses = HelloWorldskip =abstract_classes =
4, the following to automatically generate the code, open the command line tool, cd to cocos2d-x-3.0rc0 \ tools \ tolua
python genbindings_myclass.py
?
Press enter to run. If there is no problem before you will be in the cocos2d-x-3.0rc0 \ tests \ lua-empty-test \ project \ Classes with a folder auto, and then generate the inside lua_myclass_auto.cpp and lua_myclass_auto.hpp add drag such as project
5. Add the module we generated to lua during Script Engine initialization.
Edit AppDelegate. cpp, including the lua_myclass_auto.hpp header file, in
LuaEngine* engine = LuaEngine::getInstance();
?
Add later
register_all_myclass(engine->getLuaStack()->getLuaState());
6. Compile and run the program. In this way, the HelloWorld class will be exported to lua.
Test ------------------------------------------------
Open hello. lua and edit the local function main ().
Change the preceding content
localfunctionmain() -- avoid memory leak collectgarbage("setpause", 100) collectgarbage("setstepmul", 5000) localhello = HelloWorld:create() localsceneGame = cc.Scene:create() sceneGame:addChild(hello) cc.Director:getInstance():runWithScene(sceneGame) if(1==1)then return end…………
If you still do not understand what it means, go to the reference http://www.tairan.com/archives/5493