zoukankan      html  css  js  c++  java
  • cocos2dx-lua调用C++

    文参考:https://www.cnblogs.com/xiaonanxia/p/4987856.html

    上面的文章是IOS版教程,用4部分说明原理,1部分说操作步骤。

    这里用window VS2013环境说操作步骤。

    第五层:使用Cocos2d-x的方式来将C++类注册进Lua环境

    接下来说怎么用bindings-generator脚本:

    1、写自己的C++类,按照Cocos2d-x的规矩,继承cocos2d::Ref类,以便使用Cocos2d-x的内存回收机制。当然不这么干也行,但是不推荐,不然在Lua环境下对象的释放狠麻烦。  

    2、编写一个.ini文件,让bindings-generator可以根据这个配置文件知道C++类该怎么暴露出来

    3、修改bindings-generator脚本,让它去读取这个.ini文件

    4、执行bindings-generator脚本,生成桥接C++类方法

    5、用VS将自定义的C++类和生成的桥接文件加入工程,不然编译不到

    6、修改AppDelegate.cpp,执行桥接方法,自定义的C++类就注册进Lua环境里了

    看着步骤挺多,其实都狠简单。下面一步一步来。

       

    首先是自定义的C++类。我习惯将文件保存在frameworks/runtime-src/Classes/目录下:

    frameworks/runtime-src/Classes/MyClass.h  

    #include "cocos2d.h"
    using namespace cocos2d;
    class MyClass : public Ref
    {
    public:
      MyClass()   {};
      ~MyClass()  {};
      bool init() { return true; };
      CREATE_FUNC(MyClass);
     
      int foo(int i);
    };

      

    frameworks/runtime-src/Classes/MyClass.cpp
    #include "MyClass.h"
    int MyClass::foo(int i)
    {
      return i + 100;
    }

    然后编写.ini文件。在frameworks/cocos2d-x/tools/lua/目录下能看到genbindings.py脚本和一大堆.ini文件,这些就是bindings-generator的实际执行环境了。随便找一个内容比较少的.ini文件,复制一份,重新命名为MyClass.ini。大部分内容都可以凑合不需要改,这里仅列出必须要改的重要部分:  

    frameworks/cocos2d-x/tools/tolua/MyClass.ini  

    [MyClass]
    prefix           = MyClass
    target_namespace = my
    headers          = %(cocosdir)s/../runtime-src/Classes/MyClass.h
    classes          = MyClass

    也即在MyClass.ini中指定MyClass.h文件的位置,指定要暴露出来的类,指定注册进Lua环境的模块名。  

    注意:这个地方我踩了个坑。如果.ini配置文件中存在macro_judgement = ...宏定义,要特别小心,我第一次是从cocos2dx_controller.ini文件复制来的,结果没注意macro_judgement,导致生成的桥接类文件加入了不该加入的宏,只在iOS和Android平台上才起作用,对Mac平台无效,这个要特别注意。

      

    然后修改genbindings.py文件129行附近,将MyClass.ini文件加进去:

    frameworks/cocos2d-x/tools/tolua/genbindings.py  

    cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), 
                'MyClass.ini' : ('MyClass', 'lua_MyClass_auto'), 
                ...

    每次执行genbindings.py脚本时间都挺长的,因为它要重新处理一遍所有的.ini文件,建议大胆修改脚本文件,灵活处理,让它每次只处理需要的.ini文件就可以了,比如像这个样子:

    至此,生成桥接文件的准备工作就做好了,执行genbindings.py脚本:(执行命令需要的环境在下面)  

    python genbindings.py

    执行这个命令需要的条件在frameworkscocos2d-x ools olua目录下,有个README.mdown的文件说明,里面有不同系统的安装方法。

    我用的是python-2.7.14,下载地址:http://www.python.org/ftp/python/2.7.14/python-2.7.14.msi

    注意:这个README里,window版给的下载地址是过期的,所以用python的pip功能下载对应插件

    打开cmd,cd C:Python27Scripts(你自己的安装目录)

    pip install PyYAML

    pip install Cheetah

    上面两行是安装适合版本的插件。
     
    成功执行genbindings.py脚本后,会在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目录下看到新生成的桥接C++文件:  

    把这两个文件添加到VS libluacocos2d工程中auto目录下:

     在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目录下观察一下生成的C++桥接文件lua_MyClass_auto.cpp,里面的注册函数名字为register_all_MyClass(),这就是将MyClass类注册进Lua环境的关键函数:

    生成的桥接文件内容

    编辑frameworks/runtime-src/Classes/AppDelegate.cpp文件,首先在文件头加入对lua_MyClass_auto.hpp文件的引用:

    AppDelegate.cpp文件的头加入对lua_MyClass_auto.hpp文件的引用

    然后在正确的代码位置加入对register_all_MyClass函数的调用:      

      

    修改AppDelegate.cpp文件,将MyClass类注册进Lua环境

      这其中还有一个小坑,由于lua_MyClass_auto.cpp文件要引用MyClass.h文件,而这俩文件分属于不同的子项目,互相不认识头文件的搜寻路径,因此需要手工修改一下libluacocos2d子项目的包含路径 配置。在 属性-配置属性VC++目录-包含目录,这里加上MyClass.h的路径: .......... untime-srcClasses

    最后,就可以F7重新编译整个项目了,不出意外的话编译一定是成功的。

     修改main.lua文件中,尝试调用一下MyClass类:

    local test = my.MyClass:create()
    print("lua bind: " .. test:foo(99))

    然后执行程序,下面是见证奇迹的时刻~~~~!

    程序终于正确执行了

    至此,就彻底搞清楚应该怎样在Cocos2d-x项目里绑定一个C函数或者C++类到Lua环境中了,感兴趣的话可以再进一步深入研究Lua内部metatable的运作原理、类对象的生成与释放、以及垃圾回收。我自己也是刚接触Cocos2d-x不到几年,理解不深,以上难免会有用词不当或理解错误的地方,如有错误请多包涵。

  • 相关阅读:
    作业5.1 四则运算----封装
    作业四
    作业2 (完)
    作业3
    作业二。。
    数独
    回答自己的提问
    《一个程序猿的生命周期》读后感
    阅读13-17章
    阅读10,11,12章
  • 原文地址:https://www.cnblogs.com/mingfuqishi/p/10077206.html
Copyright © 2011-2022 走看看