记录一下Quick-Cocos2dx-Community lua绑定C++自定义类遇到的问题

前端之家收集整理的这篇文章主要介绍了记录一下Quick-Cocos2dx-Community lua绑定C++自定义类遇到的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

网上的quick版本貌似都是v3.3的,虽说过程八九不离十,但是对于我这样的新手来说还是很头痛的。


原理什么的就不说了,主要参考的是https://segmentfault.com/a/1190000000631630这篇文章上写的内容


首先是准备好C++的.hpp和.cpp文件,我是放到如下的目录中:


MyClass是我创建的文件夹。


接着是准备.ini和.py文件,可以去如下的目录找到genbindings.py文件以及随便找一个.ini文件复制一份


先是修改.ini文件,有如下的内容需要修改


要特别注意红线的地方,那个也是要改的,根据网上的文章,应该是要改成和prefix一致。headers就是自己写的C++的头文件图片中没有列出的我都没有做修改

然后是修改.py文件,把下图花括号中其他内容删除,然后填上 'game.ini' : ('game','lua_game_auto'),\


接下来是要按照Quick-Cocos2dx-Community/tools/tolua/README.mdown文件中所写的去做。大致就是配置python,然后下载ndk_r9b,接着在终端中输入

export NDK_ROOT=/Users/jiufenzhisan/Desktop/android-ndk-r9b,这一步应该是设置NDK_ROOT的路径,照做就可以了。然后是cd /Users/jiufenzhisan/Desktop/Quick-cocos2dx-Community/tools/tolua,即切换到tolua目录。接着就可以执行.py文件了,在终端中输入python game.py。在这边,遇到了个坑,就是执行game.py时失败了,报出LibclangError:lopen(libclang.dylib,6):image not found的错误解决办法呢是打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 : library = cdll.LoadLibrary("../bindings-generator/libclang/" + self.get_filename())


如果成功的了话,会在你复制的.py文件里的output_dir字段后的那个路径里生成两个文件lua_game_auto.hpp和lua_game_auto.cpp。至此绑定的工作完工了,接下来就是在项目中使用了。


先用player3创建一个项目,然后用Xcode打开创建的工程。如下:




打开过后,在如下的auto文件夹位置Add Files刚刚生成的两个文件



添加过后,需要在项目的AppDelegate.cpp中把生成的模块注册进lua环境:



最后就是添加一下头文件搜索路径了,否则编译会出现undefined symbols的错误



忘记说了,这边也有一个小坑,就是要在新添加文件的tagert ios打个勾,不然还是编译不过的(cpp和hpp文件都要打勾的):



至此大功告成,在lua中就可以使用自己的C++类了。在https://segmentfault.com/a/1190000000631630文章中,我用作者贡献的MyClass类虽然也生成出了两个auto文件,但在lua中使用时,一直提示attempt to a index value,不知道是什么原因。后来用http://www.cnblogs.com/howeho/p/4043580.html这篇文章中的MClass类就成功使用了,不知道是不是MyClass有问题,希望有经验的老司机可以指点我一下。


ps:如果要用player3打开自己的项目(有自己写的类),可以在/Users/jiufenzhisan/Desktop/Quick-Cocos2dx-Community/quick/player/proj.mac/player3.xcodeproj打开player3的工程。然后按照在自己项目中添加lua绑定过程的流程,在player3项目中也来一遍。然后选择Project->Archive,就会有一个player3的包生成出来,然后右击选择显示内容,把里面的player3拖出来,以后打开自己的项目就用这个就没有问题啦


ps:今天发现为什么使用上面说的MyClass类的时候会出错的原因了,就是在ini文件中,有个cpp_namespace,我之前没有去改动它,保持默认的cocos2d::ui,导致导出的auto文件没有自定义方法。而当我把cocos2d::ui去掉后,就没有问题了。当然,有可能会出现一个Undefined symbols for architecture armv7:(后面是一些你自定义方法)的错误,这是因为你没有把你自己写的.hpp和.cpp文件加到工程中去。参见上面添加生成auto文件方法添加自己的.hpp和.cpp到工程里去,就大功告成了。


忘记说使用的方法了,如图:


MyClass是我的类,copyDataToWritablePath是我自定义方法,只要这两句话就可以啦~

猜你在找的Cocos2d-x相关文章