您的位置:首页 > 移动开发 > Cocos引擎

如何使用cocos的自动绑定工具实现lua调用c++的类

2017-07-24 17:50 861 查看

如何使用cocos的自动绑定工具实现lua调用c++的类

主要分成以下步骤

1、创建自己的c++类文件

2、然后修改和执行引擎文件夹cocos2d-x-3.7\tools\tolua
目录下的genbindings.py 文件,

3、编写自己的ini文件

4、将生成的绑定文件导入到自己的cocos项目中使用

 

 

下面详细介绍每个步骤的过程

一、创建自己的c++类

以下是cocos2d-x-3.7\tests\lua-empty-test\project\Classes\MyClass\MyClasss.h头文件的内容

 


以下是cocos2d-x-3.7\tests\lua-empty-test\project\Classes\MyClass\MyClasss.cpp文件的内容

 


注意类如果不继承Ref的话,在项目里会报这个错:

错误 3 error C2683:
“dynamic_cast”:“MyClass”不是多态类型(..\Classes\lua_myclass_auto.cpp)d:\pyq_texas_cocos\texas\frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\luabasicconversions.h
365 1 texas

点击错误发现原因是: cocos2d::Ref* dynObject = dynamic_cast<cocos2d::Ref *>(ret);

Ret这个类会被动态转换,如果该类不是ret的派生类的话,那么就会报错,转换失败

 

二、修改genbindings.py
文件


在引擎cocos2d-x-3.7\tools\tolua的目录下,找到genbindings.py文件,然后我们把genbindings.py
文件复制一份,然后修改文件名,如改为mygenbindings.py

 

mygenbindings.py文件主要修改以下两个地方

第一个:output_dir = '%s/tests/lua-empty-test/project/Classes/nonamespace' % project_root

这个是修改文件的输出目录,也可以不修改,默认的输出目录是output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root

第二个:cmd_args = {'MyClass.ini' : ('mytestclass', 'lua_myclass_auto')}

这个是用来添加自己的ini文件,第一个参数是自己的ini文件名,第二个参数要与ini文件里面第一行中括号[]的内容相同,在这里写成[mytestclass],否则会出现报错,raise
Exception("Section not found in config file")找不到相应的配置文件。

 


 

三、修改ini文件

在引擎cocos2d-x-3.7\tools\tolua的目录下,有许多ini文件,这些是cocos自己绑定的类所用到的ini文件,我们选择一份内容不是很长的ini文件,然后复制一份出来,重新命名myclass.ini。

 

myclass.ini文件主要修改以下几个地方

第一个:第一行里面的内容[mytestclass],中括号里面的内容要与mygenbingdings.py里面的md_args = {'MyClass.ini'
: ('mytestclass', 'lua_myclass_auto')}第二个参数要保持一致

第二个:prefix = mytestclass
修改这个的作用是给注册文件头和注册函数的命名指定一个前缀,比如我生成的注册函数的函数名是这样的 int lua_mytestclass_MyClass_myabs(lua_State* tolua_S)
可以看出命名规则是 lua_前缀名_类名_类的函数名

然后注册文件头是这样的 int register_all_mytestclass(lua_State* tolua_S);

第三个:target_namespace = my修改命名空间,这个的作用是在lua调用c++类的时候,增加一个前缀,比如要这样来调用my.MyClass
 函数要这样来调用my.MyClas:getInstance(),
MyClass是自己定义的类名。也可以不填,保持为空,那么调用的时候就不需要加前缀,直接写类名就好,如MyClass:getInstance()

第四个:headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/MyClass/MyClass.h获取自定义类的文件头,这个的作用是指定自己类头文件的引用路径。这个一定要填写正确,否则也会绑定失败。比如在这里,我把MyClass.h头文件放在引擎的这个目录下tests/lua-empty-test/project/Classes/MyClass/
当然你也可以放在其他地方,只要路径正确就行

第五个:classes = MyClass
这个填写自己的类名就好了

下面附上我的修改图,红色为要修改的部分

 


 

修改好ini文件和py文件后,然后执行mygenbindings.py文件,若python报错,看下是否是缺少yaml、Cheetah包,若是,安装包就行了

Yaml包下载 链接:http://pan.baidu.com/s/1geAysIv
密码:80bg

Cheetah包下载 链接:http://pan.baidu.com/s/1eSvh2Sy
密码:oatv

要注意的是python的版本要选择2.7版本,否则yaml有可能安装不了

如果实在不懂,可以看看官方的说明文档,在cocos2d-x-3.7\tools\tolua
目录下的README.mdown
文档

 

执行完毕就会在相应的目录了看到绑定的文件啦

如我的是在这个路径下生成的绑定文件



我的类文件放在

 


四、将生成的绑定文件和类文件放到项目里

 


然后编译文件,编译完成后就可以在lua里面调用了

在编译的时候可能会报  错误4 error C2660:
“luaval_to_int32”:
函数不接受 4
个参数d:\pyq_texas_cocos\texas\frameworks\runtime-src\classes\lua_myclass_auto.cpp

原因是生成的绑定函数ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "MyClass:myabs");

多了一个参数,把"MyClass:myabs"这个去掉就可以了

五、lua调用c++自定义类

在编译成功后,我们就可以在我们的lua项目里调用我们自定义的c++类了,如下结果

 


 


六、有命名空间的自定义类

在写自己的自定义类的时候,有时候我们会给自己的类加相应的命名空间,如:以上面我们的MyClass类为例:

 




在这里我们加了命名空间mynamespace,再加了命名空间后,如果此时立即运行mygenbindings.py,那么会报如下错误    

raise Exception("The namespace (%s) conversion wasn't set in 'ns_map' section of the conversions.yaml" % names Exception: The namespace (mynamespace::MyClass) conversion wasn't set in 'ns_map' section of the conversions.yaml

引起这个错误的主要原因是我们的类加了命名空间后没有在conversions.yaml这个文件里添加我们的命名空间。于是找到cocos2d-x-3.7\tools\bindings-generator\targets\lua
目录下的conversions.yaml
文件,加上我们自己的命名空间

 


注意加自己的命名空间的时候,冒号后面的空格不能少,否则会报错。加好后再重新运行mygenbindings.py文件。

在这里要说明一点的是,在自定义类里面加命名空间,和前面提到的在ini文件里面要修改target_namespace这个字段,他们之间没有必然的联系。经过我的实验,如果在自定义类里面加了命名空间,而target_namespace
这个字段为空的话,那么在lua里面调用也不需要加前缀,直接用类名就行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息