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
?
1 |
output_dir = ‘%s/cocos/scripting/lua-bindings/auto‘ % project_root |
Change
?
1 |
output_dir = ‘%s/tests/lua-empty-test/project/Classes/auto‘ % project_root |
3) modify the command parameters and set
?
1234567 |
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
?
1 |
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.
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
[myclass] # the prefix to be added to the generated functions. You might or might not use this in your own # templates prefix = 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 namespace target_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/include android_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 clang extra_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 parse headers = %(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" lookup classes_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 constructor abstract_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.
?
1234567 |
[myclass] prefix = myclass target_namespace = headers = %(cocosdir)s/tests/lua-empty- test /project/Classes/HelloWorldScene.h classes = HelloWorld skip = abstract_classes = |
4, the following to automatically generate the code, open the command line tool, CD to cocos2d-x-3.0rc0 \ tools \ tolua
?
1 |
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
?
1 |
LuaEngine* engine = LuaEngine::getInstance(); |
Add later
?
1 |
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
?
123456789101112131415 |
local function main() -- avoid memory leak collectgarbage ( "setpause" , 100) collectgarbage ( "setstepmul" , 5000) local hello = HelloWorld:create() local sceneGame = cc.Scene:create() sceneGame:addChild(hello) cc.Director:getInstance():runWithScene(sceneGame) if (1==1) then return end …… …… |
Cocos2dx3.0 detailed steps for exporting custom classes to Lua