[Cocos2dx]C++自定义类绑定到Lua

Cocos2dx通过工程里面的tools/toLua工具生成注册C++函数到lua的函数cpp文件

 bindings-generator脚本的工作机制

  1.  不用编写.pkg和.h文件了,直接定义一个ini文件,注册到Lua环境里的模块名是什么,就行了。
  2.  摸清了toLua++工具的生成方法,改由Python脚本动态分析C++类,自动生成桥接的.h和.cpp代码,不调用tolua++命令了
  3. 虽然不再调用tolua++命令了,但是底层仍然使用toLua++的库函数,比如tolua_function,bindings-generator脚本生成的代码就跟使用toLua++工具生成的几乎一样

bindings-generator步骤

0.写自己的C++类,按照cocos2d-x的规矩,继承cocos2d::Ref类,以便使用cocos2d-x的内存回收机制。当然不这么干也行,但是不推荐,不然在Lua环境下对象的释放狠麻烦。首先是自定义的C++类。通常将文件保存在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);
};



//MyClass.cpp文件
#include "MyClass.h"
 
int MyClass::foo(int i)
{
  return i + 100;
}

1.按照官方提供的文档(\tools\tolua\ README.mdown)安装相应软件包
2.编写自已的脚本文件,拷贝\tools\tolua\genbindings.py, myClass.py修改如下地方

3、编写自已的配置文件,拷贝\tools\tolua\cocos2dx_spine.ini,让bindings-generator可以根据这个配置文件知道C++类该怎么暴露出来,myClass.ini修改如下地方

[Cocos2dx]C++自定义类绑定到Lua_第1张图片
•[title]:要配置将被使用的工具/ tolua的/ gengindings.py脚本的称号。一般来说,标题可以是文件名。
•prefix:要配置一个函数名的前缀,通常,我们还可以使用文件名作为前缀。关系到lua函数开头的名字,如prefix=cocos2dx,那么生成的代码就是以lua_cocos2dx开头
•target_namespace:要配置在脚本层模块的名字。在这里,我们使用cc作为模块名,当你想在脚本层REF的名称,您必须将一个名为前缀,CC在名称的前面。例如,CustomClass可以参考作为cc.CustomClass。target_namespace=custom,那么在lua中调用就是以 custom. 开头(但这个参数好像控制不到,真正能控制的是在C++里面是否有custom的命名空间)
这里有两点要注意的
如果有自定义的命名空间,cocos2dx主目录的tools文件夹下bindings-generator\targets\lua下的conversions.yaml(js的是bindings-generator\targets\spidermonkey下的conversions.yaml)添加自己的命名空间:

ns_map:
"cocos2d::extension::": "cc."
"cocos2d::ui::": "ccui."
"cocos2d::": "cc."
"spine::": "sp."
"cocostudio::": "ccs."
"cocosbuilder::": "cc."
"CocosDenshion::": "cc."
"ccmy::": "ccmy."

这个文件貌似是一些替换操作配置(就是在生成C++文件中替换掉所设置的的字符串),自己研究一下就知道了。
•headers:要配置所有需要解析的头文件和%(cocosdir)s是的Cocos2d-x的引擎的根路径。
•classes:要配置所有绑定所需的类。在这里,它支持正则表达式。因此,我们可以设置MyCustomClass。*在这里,用于查找多个特定的用法,你可以对照到tools/tolua/cocos2dx.ini。

[Cocos2dx]C++自定义类绑定到Lua_第2张图片

4、终端进入\tools\tolua, 执行刚修改的角本./genbindings_custom.py,成功后在output_dir指定目录会生成lua_xxx_auto.hpp,lua_xxx_auto.cpp等文件
5、把生成的文件添加至项目中,编辑AppDelegate.cpp文件,
a.包含lua_xxx_auto.hpp文件
b.在函数applicationDidFinishLaunching()中的函数register_all_packages(L);中添加lua_xxx_auto.hpp文件的函数register_xxx(L);

6.编写lua脚本调用

    function myadd(x, y)
        -- 自定义
        local test = ccmy.MyClass:create()
        print("lua bind: " .. test:foo(99))
        return x + y
    end

7.如果C++类定义了namespace,则需要修改frameworks/cocos2d-x/tools/bindings-generator/targets/lua/conversions.yaml文件,定义namespace与Lua之间的映射关系,否则会报conversion wasn't set错误:

8.因为创建之后,编译成apk时,需要找到对应的文件,需要在mk文件添加 不然编译的时候提示 " error: undefined reference to register_all_xxx" 未定义

#自己的android工程目录下jni/Android.mk文件添加
LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
		   ../../Classes/xxx.cpp \

Cocos2d-x 3.1 Lua Binding

你可能感兴趣的:(Cocos2dx)