• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

如何使用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人参与评论

请发表评论

全部评论

专题导读
上一篇:
cocos2dx-lua之断点调试支持发布时间:2022-07-22
下一篇:
luajit+nginx+上传模块+lua模块编译安装发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap