在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如何使用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里面调用也不需要加前缀,直接用类名就行。 |
请发表评论