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

9 篇文章 0 订阅

如何使用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报错,看下是否缺少yamlCheetah包,若是,安装包就行了

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函数不接受 个参数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里面调用也不需要加前缀,直接用类名就行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值