使用cocos2d-x的方式来将C++类注册进Lua环境

原创 棋牌源码  2019-04-26 22:57:41  阅读 363 次 评论 0 条
  • 摘要:

    cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua环境里的。不过这种方法明显笨拙,既要写真正做事的.pkg文件,也要写桥接的.pkg文件和.h文件,工作量又大又枯燥。所以从cocos2d-x 3.x开始,用bindings-generator脚本代替了toLua++。bindings-generator脚本的工作机制是:1、不用挨个类地写桥接.pkg和.h文件了,直接定义一个ini文件,告诉脚本哪些类的哪些方法要暴露出来,注册到Lua环境里的模块名

    cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua环境里的。不过这种方法明显笨拙,既要写真正做事的.pkg文件,也要写桥接的.pkg文件和.h文件,工作量又大又枯燥。所以cocos2d-x 3.x开始,用bindings-generator脚本代替了toLua++。

    bindings-generator脚本的工作机制是:

    1、不用挨个类地写桥接.pkg和.h文件了,直接定义一个ini文件,告诉脚本哪些类的哪些方法要暴露出来,注册到Lua环境里的模块名是什么,就行了,等于将原来的每个类乘以3个文件的工作量变成了所有类只需要1个.ini文件
    2、摸清了toLua++工具的生成方法,改由Python脚本动态分析C++类,自动生成桥接的.h和.cpp代码,不调用tolua++命令了
    3、虽然不再调用tolua++命令了,但是底层仍然使用toLua++的库函数,比如tolua_function,bindings-generator脚本生成的代码就跟使用toLua++工具生成的几乎一样

    bindings-generator脚本掌握了生成toLua++桥接代码的主动权,不仅可以省下大量的.pkg和.h文件,而且可以更好地插入自定义代码,达到cocos2d-x环境下的一些特殊目的,比如内存回收之类的。所以cocos2d-x从3.x开始放弃了toLua++和.pkg而改用了自己写的bindings-generator脚本是非常值得赞赏的聪明做法。

    接下来说怎么用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、用Xcode将自定义的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/tolua/目录下能看到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文件就行了,不知道将来cocos2d-x团队会不会这样优化)

    至此,生成桥接文件的准备工作就做好了,执行genbindings.py脚本:

    python genbindings.py
    (在Mac系统上可能会遇到缺少yaml、Cheetah包的问题,安装这些Python包狠简单,先sudo easy_install pip,把pip装好,然后用pip各种pip search、sudo pip install就可以了)

    0 


    本文地址:http://www.6603.com.cn/post/234.html
    版权声明:本文为原创文章,版权归 棋牌源码 所有,欢迎分享本文,转载请保留出处!
  • 会员办理
    点击这里给我发消息

    接口开户
    点击这里给我发消息

    开发服务
    点击这里给我发消息

    x提交留言
    * 必填项
    * 必填项
    看不清点击图片换一张