cocos2dx lua 热更新3.1 lua绑定c++类中怎么出错了

问题已关闭
问题表意不明
请将问题表述完整,消除歧义。让其他人准确理解你的提问是获得回答的前提。
cocos2dx 3.x 绑定lua的原理?
想明白cocos2dx 3.x是绑定lua进行开发的,怎么新建lua工程,lua是怎么调用到2dx的API的,想深入了解一下具体过程,麻烦不吝赐教!
lua是开源的,看一下luac api就知道C和lua如何通信了,然后无非就是绑定C++类和函数到lua层。
已有帐号?
无法登录?
社交帐号登录如何在cocos2d c++代码中调用lua以及探究_百度知道Quick-Cocos2d-x 3.3绑定自定义类至Lua(四)使用绑定C++至Lua的自定义类
Quick-Cocos2d-x 3.3绑定自定义类至Lua(四)使用绑定C++至Lua的自定义类
续动手绑定自定义类至Lua
之后,我们已经完成了自定义类至Lua的绑定。在接下来的环节,我们将使用它。
首先,我们需要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单。
&&&&1.&lua_pet_auto.hpp
&&&&2.&lua_pet_auto.cpp
&&&3.&lua_pet_auto_api.lua
&&&&4.&Pet.lua
检查这些文件是否在你的项目当中相对的路径。(F:\Cocos2dx-Lua\Garfield 这是我的示例项目所在路径)。
一切无误的话,我们使用VS2013将&Garfield.sln&工程文件打开。我们将在&libluacocos2d\auto&中引入&lua_pet_auto.hpp&、&lua_pet_auto.cpp&。这两个文件声明及定义&register_all_custom_pet()&全局函数,用于完成对C++绑定类的注册,完成类中成员属性及成员函数向Lua的&注入&,实现C++类结构至Lua的&解析&。&register_all_custom_pet()&函数我们一会将用到。
检查第三章节中我们创建的&Pet&类文件是否已经正确引入到VS2013工程中。
完成这些文件的引入之后,我们将在引擎入口协议类&AppDelegate&调用&register_all_custom_pet()&函数来完成绑定类在该项目的注册。
1. 引入& #include &lua_pet_auto.hpp&&头文件; ( & register_all_custom_pet() & 定义于该文件中)
2. 调用&&register_all_custom_pet()&&。
接下来,我们可以在Quick-Cocos2d-x项目中使用该&Pet&了。我将在Cocos Code IDE中编写我的脚本程序,该脚本代码中使用了由C++定义的类Pet。如下:
回到VS2013工程,运行项目。
如果你碰到诸如“打开vs工程导入lua_pet_auto.cpp 和lua_pet_auto.hpp ,lua_pet_auto.cpp中报错说找不到pet.h 文件 编译报错说..\auto\lua_pet_auto.cpp(2): fatal error C1083: 无法打开包括文件:“Pet.h”: No such file or directory”这样的错误,请参照下面的截图,在VS中填加Class的包含路径。
写在最后,为了希望可以尽量帮助看到该篇博文的读者,笔者尽力将每个环节都进行了详细的截图和说明,难免会略有赘述。同时小心翼翼的验证每个环节,但难免有纰漏之处,如果你在阅读的过程中发现问题,可与我联系,非常乐意与你交流。
我的热门文章
即使是一小步也想与你分享shahdza 的BLOG
用户名:shahdza
文章数:114
评论数:75
访问量:286058
注册日期:
阅读量:5863
阅读量:12276
阅读量:336056
阅读量:1040141
51CTO推荐博文
【唠叨】&&&&本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类。&&&&网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且也很难看懂他们到底在讲什么。& & 其实,在cocos2dx v3.2版本中,提供了bindings-generator脚本来封装toLua++的用法,从而节省了工作量。【致谢】&&&&&(讲得非常好!)&&&&&(官方文档)【使用工具】&&&&Windows7 x64&&&&Cocos2dx v3.2&&&&Cocos Code IDE 1.0.1 (支持自定义类的智能提示功能)&&&&python 2.7.x(v3.2版本不一定要2.7.3,我用2.7.8也成功了的)& & NDK r9d&,解压并配置环境变量NDK_ROOT(v3.2版本不一定要r9b,我用r9d成功了的)&&&&pyyaml ,安装到 "Python的安装目录\Lib\site-packages"&&&&&&&&&&&&Cheetah ,并解压到 "Python的安装目录\Lib\site-packages"&&&&&&&&&&&&dos2unix ,windows下可能在执行脚本时有这个错误。&&&&&&&&解压到一某个目录下面, 并设置PATH环境变量的值指向bin目录下。&&&&&&&& & & 【MAC】参见: 【绑定方法】& & 以下介绍的是在&Windows7 + VS2013 + Cocos Code IDE。&&&&并使用Cocos Code IDE创建的Lua项目,绑定方法。1、将自定义的C++代码放在&frameworks\runtime-src\Classes 下&&&&当然放哪里是随意的,我喜欢放在Classes下。650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL0zrCwXR9AAF0rHubdVQ695.jpg" title="1.jpg" alt="wKioL1RL0zrCwXR9AAF0rHubdVQ695.jpg" />2、添加自定义类的.ini文件&&&&在&frameworks\cocos2d-x\tools\tolua 中,复制一份该文件夹下cocos2dx.ini的配置信息,然后修改一些参数,改成我们自定义类的参数。650) this.width=650;" src="/wyfs02/M01/4D/1F/wKioL1RL1NvAEgUdAAAxRDlqd4k342.jpg" title="3.png" alt="wKioL1RL1NvAEgUdAAAxRDlqd4k342.jpg" />&&&&以下列出需要修改的参数配置:[custom_api]
#&prefix会被添加到生成的函数.你也可以选择不添加这个到你的模板
prefix&=&custom_api
#&所有的类都会嵌入到这个命名空间
target_namespace&=&my
#&类所在的路径,如果有多个,用空格隔开
headers&=&%(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h
#&需要注册的类,如果有多个,用空格隔开
classes&=&PanZoomLayer
#&不提供给Lua的public成员函数
skip&=&PanZoomLayer::[onTouchesBegan&onTouchesMoved&onTouchesEnded&init&onEnter&onExit&update]
#&这些全空就好了
rename_functions&=
rename_classes&=&
remove_prefix&=&
classes_have_no_parents&=&
base_classes_to_skip&=
abstract_classes&=&
script_control_cpp&=&no3、genbindings.py 添加自定义的配置.ini&&&&在&frameworks\cocos2d-x\tools\tolua 的&genbindings.py&中的129行找到&cmd_args 。&&&&将我们自定义的&custom_api.ini 添加进去,并注释掉其他.ini(这些已经不需要重新生成)650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL2RGx9zP1AAMRjTrGUh4452.jpg" title="2.jpg" alt="wKioL1RL2RGx9zP1AAMRjTrGUh4452.jpg" />4、运行&genbindings.py 脚本&&&&在终端运行&genbindings.py 脚本。&&&&在这里,我是直接写了一个批处理文件 .bat 。&&&&注意:只要需要用到的工具都下载,安装,配置好了,一般就能生成成功。&&&&&&&&&&&&生成失败的,基本都是因为工具没有配置好。650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL2WPAnAYnAAD5jo7zWb8151.jpg" title="22.jpg" alt="wKiom1RL2WPAnAYnAAD5jo7zWb8151.jpg" />&&&&生成成功后,在&frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 中会找到我们生成的C++的桥接文件, lua_custom_api_auto.cpp 和 lua_custom_api_auto.hpp 。650) this.width=650;" src="/wyfs02/M01/4D/1F/wKioL1RL2y6DVRX7AAB3H2ztpRw355.jpg" title="222.png" alt="wKioL1RL2y6DVRX7AAB3H2ztpRw355.jpg" />&&&&其中 lua_custom_api_auto.hpp 中的&register_all_custom_api 就是我们用来将PanZoomLayer类注册到Lua环境中的关键函数。650) this.width=650;" src="/wyfs02/M00/4D/1E/wKiom1RL3CvQsTBNAAFpA5UFDjQ936.jpg" title="QQ图片41.jpg" style="text-align:white-space:" alt="wKiom1RL3CvQsTBNAAFpA5UFDjQ936.jpg" />&&&&以及在&frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中也能够找到我们提供给Lua调用的接口文件。650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL23LiE_2EAADt_Dl4paM431.jpg" title="10.jpg" alt="wKiom1RL23LiE_2EAADt_Dl4paM431.jpg" />5、编译注册到Lua&&&&注册自定义类的函数在我们的&lua_custom_api_auto.hpp 中可以看到。&&&&&&&&register_all_custom_api(lua_State* tolua_S)650) this.width=650;" src="/wyfs02/M00/4D/1E/wKiom1RL3CvQsTBNAAFpA5UFDjQ936.jpg" title="QQ图片41.jpg" alt="wKiom1RL3CvQsTBNAAFpA5UFDjQ936.jpg" />&&&&使用 VS2013 打开&frameworks\runtime-src\proj.win32 下的工程。& & (1)将自定义的类 PanZoomLayer 添加到项目工程的Classes下。650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL3c6yZ4PEAAB3OlLbZhk958.jpg" title="QQ图片26.jpg" alt="wKiom1RL3c6yZ4PEAAB3OlLbZhk958.jpg" />&&&&(2)将&lua_custom_api_auto.cpp、lua_custom_api_auto.hpp&添加到工程liblua的auto下。650) this.width=650;" src="/wyfs02/M02/4D/1E/wKiom1RL3qDikRCvAAG_ncnZkvQ661.jpg" title="QQ图片08.jpg" alt="wKiom1RL3qDikRCvAAG_ncnZkvQ661.jpg" />&&&&(3)添加lualib工程的文件搜索路径。&&&&&&&&将&$(EngineRoot)../runtime-src/Classes 路径加进去。650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL32rhaAU8AAE8tMBgTpw591.jpg" title="QQ图片08.jpg" alt="wKioL1RL32rhaAU8AAE8tMBgTpw591.jpg" />& & (4)编辑&frameworks\runtime-src\Classes 下的入口类 AppDelegate.cpp&&&&&&&&&&添加:lua_custom_api_auto.hpp&头文件650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL3Lug2Np1AAAqi0a-IYQ249.jpg" style="float:" title="QQ图片52.png" alt="wKiom1RL3Lug2Np1AAAqi0a-IYQ249.jpg" />&&&&&&&&& 注册:register_all_custom_api(state)&&&&&&&&& 注意:register_all_custom_api 的上下两句话,必须加上!650) this.width=650;" src="/wyfs02/M02/4D/1F/wKioL1RL3Q2QDNclAAHPrYX_6BI408.jpg" style="float:" title="QQ图片56.png" alt="wKioL1RL3Q2QDNclAAHPrYX_6BI408.jpg" />&&&&&&&&(5)编译运行整个项目,完成C++类的注册到Lua。&&&&&&&&然后就可以再Lua中愉快的使用自定义的类了!【开启智能提示】&&&&虽然我们将我们自定义的C++类注册到了Lua中调用,但是在Cocos Code IDE中却没有我们自定义类的智能提示。&&&&我们需要修改一些配置,让Cocos Code IDE加上对我们自定义类的智能提示。1、Cocos2dx引擎中的智能提示&&&&首先我们来看一下Cocos Code IDE中cocos2dx引擎的智能提示是怎么搞的。&&&&随便找个 cc.Label 把!&&&&我们按住键盘的 ctrl 键,然后点击 cc 和 Label,就会跳转到声明它们的地方。650) this.width=650;" src="/wyfs02/M00/4D/1E/wKiom1RL4vGjjv10AAAi5Dt7P4A782.jpg" title="QQ图片45.png" alt="wKiom1RL4vGjjv10AAAi5Dt7P4A782.jpg" />& & 文件跳转到了如下两幅图的地方:650) this.width=650;" src="/wyfs02/M02/4D/1F/wKioL1RL4-KhMI4XAAFP955pFxc307.jpg" style="float:" title="QQ图片09.jpg" alt="wKioL1RL4-KhMI4XAAFP955pFxc307.jpg" />650) this.width=650;" src="/wyfs02/M01/4D/1F/wKioL1RL4-OihcZkAAGNcLJuOOY308.jpg" style="float:" title="QQ图片42.jpg" alt="wKioL1RL4-OihcZkAAGNcLJuOOY308.jpg" />&&&&可能看到以上两幅图,你就明白应该怎么给我们自定义的C++类加上智能提示了吧?&&&&我们先找到以下文件路径:(可能每个人的不一样)&&&&\CocosCodeIDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2& & 可以发现该路径下有一个 api.zip 这个压缩包。&&&&我们将其 api.zip 解压出来看看里面都是什么东西。650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL5I7QTUXfAAE4J2kdwJU349.jpg" title="QQ图片15.jpg" alt="wKiom1RL5I7QTUXfAAE4J2kdwJU349.jpg" />650) this.width=650;" src="/wyfs02/M02/4D/1F/wKioL1RL5prSbATiAAF56z9JNAI653.jpg" title="QQ图片43.jpg" alt="wKioL1RL5prSbATiAAF56z9JNAI653.jpg" />650) this.width=650;" src="/wyfs02/M02/4D/1E/wKiom1RL9vuT2T9LAAJ2fGK5-kU348.jpg" title="2222.jpg" alt="wKiom1RL9vuT2T9LAAJ2fGK5-kU348.jpg" />&&&&可以发现里面全是cocos2dx的C++类提供给Lua的接口声明。&&&&这些也就是IDE中智能提示的原因。2、添加自定义类的智能提示(方式一)&&&&我们仿照 api.zip 中的 cc.lua 和 label.lua 来写一个自定义类的接口声明。&&&&& & & my.lua& & & & & &:声明命名空间&&&&&&&&& PanZoomLayer.lua&:声明自定义类。(这个在使用脚本绑定时,自动生成)&&&&其中&PanZoomLayer.lua 在使用&genbindings.py&脚本时,就自动生成了的。&&&&&&&&就在&frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中。&&&&那么,我们再写一个 my.lua ,也放在这个目录下好了。& & 其中,my.lua 代码如下:--------------------------------
--&@module&my
--------------------------------------------------------
--&the&my&PanZoomLayer
--&@field&[parent=#my]&PanZoomLayer#PanZoomLayer&PanZoomLayer&preloaded&module
return&nil650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL947iMVEQAAEoZxR9ge8316.jpg" title="333.jpg" alt="wKioL1RL947iMVEQAAEoZxR9ge8316.jpg" />&&&&PanZoomLayer.lua 代码如下:650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL6cCiCX9WAAM6bAzCK7Y304.jpg" title="QQ图片10.jpg" alt="wKioL1RL6cCiCX9WAAM6bAzCK7Y304.jpg" />&&&&然后我们将 my.lua 和&PanZoomLayer.lua 一并压缩到 myapi.zip 中。&&&&就放在&\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中好了。650) this.width=650;" src="/wyfs02/M01/4D/1F/wKioL1RL6wPiJgirAAEhY5DYprw732.jpg" title="QQ图片23.png" alt="wKioL1RL6wPiJgirAAEhY5DYprw732.jpg" />&&&&然后我们打开Cocos Code IDE的工程项目,配置属性。&&&&&&&&Lua-&Build Path-&Libraries-&Add External Zips。&&&&将我们的 myapi.zip 压缩包添加进去,点击“确定”。650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL6y6whGwdAAL9na5GZdw128.jpg" title="QQ图片11.jpg" alt="wKiom1RL6y6whGwdAAL9na5GZdw128.jpg" />&&&&这样,就可以在 Cocos Code IDE 中愉快的玩我们自定义的类了。&&&&有智能提示,就是爽啊!!!650) this.width=650;" src="/hi/face/i_f07.gif" alt="i_f07.gif" />650) this.width=650;" src="/wyfs02/M02/4D/1F/wKioL1RL7FrhojIFAABaW9-L54M677.jpg" style="float:" title="w.png" alt="wKioL1RL7FrhojIFAABaW9-L54M677.jpg" />650) this.width=650;" src="/wyfs02/M02/4D/1E/wKiom1RL7AiDort9AACENIlt5Ec002.jpg" style="float:" title="ww.png" alt="wKiom1RL7AiDort9AACENIlt5Ec002.jpg" />650) this.width=650;" src="/wyfs02/M00/4D/1F/wKioL1RL7KLjVoFUAAHqxAbDB40728.jpg" title="www.png" alt="wKioL1RL7KLjVoFUAAHqxAbDB40728.jpg" />3、添加智能提示(方式二)&&&&通过上面的方式一的方法虽然可以有智能提示,可是后来我发现定义的命名空间 my 却无法识别。这样的结果将导致创建的 my.PanZoomLayer:create() 赋值给 self 的成员 self.pzLayer 后,继续使用&self.pzLayer 时,对应的函数又无法提示了。650) this.width=650;" src="/wyfs02/M00/4D/26/wKiom1RMtE6xkHlyAABfA0aiUEs010.jpg" title="QQ图片48.png" alt="wKiom1RMtE6xkHlyAABfA0aiUEs010.jpg" />&&&&所以这里我们通过修改官方智能提示包 api.zip ,来达到更加的智能提示的效果。&&&&操作方法和方式一类似,我们先将官方的提示包 api.zip 解压出来,最好将其备份一份。&&&&文件在:&&&&\Cocos Code IDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2650) this.width=650;" src="/wyfs02/M01/4D/27/wKioL1RMtUmSCXySAAEYK8cc_HA675.jpg" title="QQ图片39.jpg" alt="wKioL1RMtUmSCXySAAEYK8cc_HA675.jpg" />&&&&然后我们将我们自定义提示包 my.lua 和 PanZoomLayer.lua 放入 api 文件夹中。650) this.width=650;" src="/wyfs02/M00/4D/26/wKiom1RMtkTQSQsKAAJeXFL4uHQ687.jpg" title="QQ图片10.jpg" alt="wKiom1RMtkTQSQsKAAJeXFL4uHQ687.jpg" />&&&&然后在 api 文件夹中找到 global.lua 这个全局声明文件。&&&&将我们自定义的命名空间 my 声明进去。--&the&my&module
--&@field&[parent=#global]&my#my&my&preloaded&module650) this.width=650;" src="/wyfs02/M00/4D/27/wKioL1RMteOzU_PZAAObQErZ1ys759.jpg" title="QQ图片12.jpg" alt="wKioL1RMteOzU_PZAAObQErZ1ys759.jpg" />&&&&保存关闭,将 api 文件夹压缩成 api.zip 包。650) this.width=650;" src="/wyfs02/M01/4D/27/wKioL1RMtu7xnSPPAADALEjJJDI186.jpg" title="QQ图片37.jpg" alt="wKioL1RMtu7xnSPPAADALEjJJDI186.jpg" />&&&&&&&&然后刷新我们的项目工程,然后再来试试我们自定义类的智能提示效果。&&&&可以发现,自定义的类的智能提示已经和 官方的智能提示功能 完全一致了。&&&&又可以愉快的玩耍啦!!!650) this.width=650;" src="/hi/face/i_f28.gif" alt="i_f28.gif" />650) this.width=650;" src="/wyfs02/M02/4D/26/wKiom1RMtuugmiVrAAJ-31JEBW4104.jpg" title="QQ图片58.jpg" alt="wKiom1RMtuugmiVrAAJ-31JEBW4104.jpg" />【遇到的问题】1、脚本生成出错650) this.width=650;" src="/wyfs02/M02/4D/1D/wKiom1RLzk7A7N1lAANtk3-0x9o550.jpg" style="float:" title="QQ图片41.jpg" alt="wKiom1RLzk7A7N1lAANtk3-0x9o550.jpg" />650) this.width=650;" src="/wyfs02/M00/4D/1E/wKioL1RLzqDy_XmDAALksUIjK3g521.jpg" style="float:" title="QQ图片36.jpg" alt="wKioL1RLzqDy_XmDAALksUIjK3g521.jpg" />&&&&&&&&这些出错都是由于没有配置&pyyaml、Cheetah、dos2unix 引起的,都下过来配置一下即可。2、编译到Android手机出错&&&&上面的配置完成后IOS的部分是可以正常运行的,但是这个时候编译android时不通过的。&&&&因为 AppDelegate.cpp 里面调用的 register_all_MyClass(L) 方法在android不存在,android的项目里并没有配置去编译对应的 PanZoomLayer.cpp 文件和后续生成的 lua_custom_api_auto.cpp。&&&&所以需要在android端配置Android.mk文件,让项目编译时去编译这两个C++文件才行。&&&&(1)首先配置JNI下面的Android.mk文件,让JNI部分编译时去编译PanZoomLayer.cpp:&&&&&&&&编辑 frameworks/runtime-src/proj.android/jni/Android.mk&&&&&&&&在 LOCAL_SRC_FILES 参数的后面添加:(注意后面的 \ ,仅最后一行不加斜杠)&&&&&&&&&&&&../../Classes/PanZoomLayer.cpp650) this.width=650;" src="/wyfs02/M00/4D/1E/wKiom1RL-RKiDEywAAH-iwiWIIY738.jpg" title="a.png" alt="wKiom1RL-RKiDEywAAH-iwiWIIY738.jpg" />&&&&&&&&在&LOCAL_C_INCLUDES 参数的后面添加:(注意后面的&\&,仅最后一行不加斜杠)&&&&&&&&&&&&$(LOCAL_PATH)/../../Classes650) this.width=650;" src="/wyfs02/M01/4D/1F/wKioL1RL-XvyZNt9AABZE6y2eYQ966.jpg" title="aa.png" alt="wKioL1RL-XvyZNt9AABZE6y2eYQ966.jpg" />&&&&(2)然后配置&frameworks/cocos2d-x/cocos/scripting/lua-bindings/Android.mk文件。&&&&&&&&在&LOCAL_SRC_FILES 参数的后面添加:(注意后面的&\&,仅最后一行不加斜杠)&&&&&&&&&&&&auto/lua_custom_api_auto.cpp650) this.width=650;" src="/wyfs02/M01/4D/1E/wKiom1RL-TyA_qxTAAHW36-i5xM024.jpg" title="aaa.png" alt="wKiom1RL-TyA_qxTAAHW36-i5xM024.jpg" />&&&&&&&&在&LOCAL_C_INCLUDES 参数的后面添加:(注意后面的&\&,仅最后一行不加斜杠)&&&&&&&&&&&&$(LOCAL_PATH)/../../../../runtime-src/Classes650) this.width=650;" src="/wyfs02/M02/4D/1F/wKioL1RL-ZyS6JLUAAGIxbrx4oo396.jpg" title="aaaa.png" alt="wKioL1RL-ZyS6JLUAAGIxbrx4oo396.jpg" />&&&&(3)然后 Build-Runtime,将项目在Android端编译一下。650) this.width=650;" src="/wyfs02/M02/4D/1E/wKiom1RL-YTCkK43AAE9zSpAmfo656.jpg" title="tt.jpg" alt="wKiom1RL-YTCkK43AAE9zSpAmfo656.jpg" />&&&&(4)若编译成功,就可以在Android手机上测试了!本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
13:37:54 14:59:54 15:03:48 15:10:28

我要回帖

更多关于 cocos2dx lua api 的文章

 

随机推荐