• Coco2dx-3.0中怎样调用LUA


    一个用3.0的工具导出类到lua,自己主动生成代码的方法。


    曾经要导出c++类到lua。就得手动维护pkg文件,那简直就是噩梦。3.0以后就会感觉生活非常轻松了。



    以下我就在说下详细做法。


    1、安装必要的库和工具包,以及配置相关环境变量,请依照cocos2d-x-3.0rc0 ools oluaREADME.mdown说得去做,不做赘述。

    2、写c++类(我測试用的是cocos2d-x-3.0rc0 estslua-empty-testprojectClassesHelloWorldScene.cpp)

    3、写一个生成的python脚本,你不会写,没关系,我们会照猫画虎
       1)进入文件夹cocos2d-x-3.0rc0 ools olua,复制一份genbindings.py,命名为genbindings_myclass.py

       2)把生成文件夹制定到咱project里去,打开genbindings_myclass.py把

    output_dir='%s/cocos/scripting/lua-bindings/auto' % project_root

     改成

    output_dir='%s/tests/lua-empty-test/project/Classes/auto'% project_root

      3)改动命令參数,把

    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'), 
                        }

        改成

    cmd_args={'myclass.ini': ('myclass','lua_myclass_auto') }

        4)这时你可能问myclass.ini在哪啊,我们下来就写这个文件。

    原理一样。我还是照猫画虎。拿cocos2dx_spine.ini改的。

    [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

    .ini中部分參数的使用方法:
    name: 单纯仅仅是名称。
    prefix: 最后生成的文件都会以这个命名前缀。如 prefix.cpp, prefix.hpp, prefix_api.js
    classes: 你的所需转换的类的名称。必须是所导入的头文件里全部的类,这里能够使用正則表達式来加入多个类。參考cocox2ds.ini。
    extra_arguments:一些接口所需的系统參数。如clang包,android ndk包的引入所需的系统參数在此加入,写法能够參照以上三个.ini都有。
    headers: 你所须要绑定的头文件路径。
    target_namespace:命名空间。

    最后生成的JS文件的类,会以这个命名空间开头。比如你的类为sqlite,命名空间为cocos2dx,那么最后生成的就是cocos2dx.sqlite。 rename_functions:能够将你要绑定的方法的名称更改成你所要的。能够更改多个。用逗号隔开,写法參照 SqliteCpp::[sqlite3_execCpp=sqlite3_exec],这个就是将SqliteCpp中的sqlite3_ execCpp方法重命名为sqlite3_exec方法。

    rename_classes :同上。重命名类。

    skip :跳过你所不须要绑定的方法和类,于是就不生成。

        改的时候要注意这些行

    [myclass]
    prefix = myclass
    target_namespace =
    headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.h
    classes = HelloWorld
    skip =
    abstract_classes =

    4、以下要自己主动生成代码了。打开命令行工具,cd到cocos2d-x-3.0rc0 ools olua下。敲入

    python genbindings_myclass.py

    回车执行。假设前面没问题的话你会在cocos2d-x-3.0rc0 estslua-empty-testprojectClasses多了一个目录auto,然后把里面生成lua_myclass_auto.cpp和lua_myclass_auto.hpp增加拽如工程

    5、把我们生成的个module在脚本引擎初始化的时候增加lua。


    编辑AppDelegate.cpp,包括lua_myclass_auto.hpp头文件,在

    LuaEngine* engine = LuaEngine::getInstance();

    ?

    后面增加

    register_all_myclass(engine->getLuaStack()->getLuaState());

    6、编译执行。这样HelloWorld这个类就被导出到lua了。



    測试------------------------------------------------
    打开hello.lua,编辑local function main()这个函数

    把前面改成

    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
    ……
    ……

    假设还是没懂什么意思,就去參考http://www.tairan.com/archives/5493

     


  • 相关阅读:
    构建之法阅读笔记一
    第一冲刺阶段 工作总结 02
    第一冲刺阶段 工作总结 01
    学习进度条 第七周
    团队计划会议 01
    团队博客 一 需求分析
    学习进度条 第六周
    数组练习3 求最大连通子数组的和
    03构建之法阅读笔记之三
    团队项目个人每日总结(4.19)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5082255.html
Copyright © 2020-2023  润新知