在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一. 简单介绍 文章介绍是在实际的游戏开发项目中,将自定义的C++类绑定到lua中,能够让lua调用c++类。会创建一个python脚本,执行python脚本会让自动将我们的c++类绑定到lua。生成我们要的代码。文章会介绍配置环境、编写脚本、测试类、实际项目中调用,以及一些遇到的问题
二.兵马未动粮草先行
当前我用的是quicklua 3.3 win7系统。下载需要的工具
可以先看一下 \tools\tolua \README.mdown里面有详细介绍,而且都有下载地址
我现在是win系统,翻译一下
(1). 要保证你的ndk是 android-ndk-r9b,配环境变量
(2). Python 2.7.3(32bit),配置环境变量,自己在网上查
安装pyyaml 我之前安装失败是因为python版本不对,然后改成上面的
(3).pycheetah 解压到你python文件下lib\site-packages
具体可以参考 http://cn.cocos2d-x.org/tutorial/show?id=2518
三.创建一个头文件类CustomHeaders.h
在 项目的\frameworks\runtime-src\Classes创建一个类,就是项目放classes的地方.
批量绑定的时候用,具体作用后面会讲到,可以创建一个例子
/* #endif 四.几个测试类 我们需要绑定到lua的类。这里我写了两个测试类MyTestClass 和MyTestClass2。如 MyTestClass2.h
#ifndef __MYTESTCLASS2_H__ MyTestClass2.cpp #include "MyTestClass2.h" 两个都差不多。就是返回整数。 五.写一个python脚本,和一个ini \tools\tolua文件夹下的genbindings.py复制一份。我们重新起名咱们用的py。 \tools\tolua文件夹下的任意一个ini文件复制一份。我们可以重新起名为我们用的配置文件比如myclass.ini 这里我该成myclass_genbindings.py。名字随便。有两个地方需要改然后找到 (1)修改py 1.output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root 将输出路径改为咱们自己的classes文件夹下。可以根据自带的路径写出自己的路径例如: output_dir='%s/project/cardgame/frameworks/runtime-src/Classes' % project_root。 组装的路径。project_root当前项目的目录,然后加上后面你自己的classes路径 当然可以在classes文件夹下创建一个auto文件夹,来存放自动生成的文件,我这里没有创建 2. cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), 。。。 改成: cmd_args = {'myclass.ini' : ('myclass', 'lua_myclass_auto')} 第一个参数是之前的ini文件。 第二个后面要用到。第三个是脚本生成的文件的名字lua_myclass_auto (2)修改ini 1.将第一行改成 [上面的第二个]比如[myclass] 2.prefix = myclass 3.target_namespace =什么什么的改成 target_namespace = 注:后面会讲到=空或者=其他的原因 4.headers = 什么什么的 改成咱们上面写的CustomHeaders.h的路径,可以根据已经有的路径拼接处咱们的路径 如:%(cocosdir)s/project/cardgame/frameworks/runtime-src/Classes/CustomHeaders.h 5、classes = 咱们需要绑定的类的名字 ,如 classes = MyTestClass MyTestClass2 可以支持多个。需要在CustomHeaders.h文件中导入自定义类的头文件,然后在classes=后面添加上类名就 可以 OK了。我们 cd 到myclass_genbindings.py脚本的文件夹下,执行脚本 python myclass_genbindings.py 就可以自动绑定拉。 小技巧:在文件夹,按住shift+鼠标右键,可以看到 在此处打开命令窗口,比较方便、 六.上面写ini简单介绍 1、首先必须了解正则表达式,百度直接搜索正则表达式 舀鱙A类中有函数参数或返回值用到State类型的,在生成过程中汇报错,报错消息称没有A的命名空间。。。那么这时候就得到第一点提及的地方加入一行:"A::":"A."的信息。在有命名空间的情况下,生成器直接通过。这里是个奇怪的问题。 七。在我们的项目中添加刚才创建的类和自动生成的类、然后在 AppDelegate.cpp中: (1)#include "lua_myclass_auto.hpp" //导入我们自动生成的文件 (2)找到脚本引擎初始化的地方,和其他的语句一样 lua_myclass_auto.hpp中的方法register_all_**(L)这里是register_all_myclass(L) 编译生成 可以了。 在lua中。使用例子 local testValue = MyTestClass:getTestData() 遇到问题可能是配置不对,类写的不对等。输出那可以找到
lua的table 到c++的map ——> 可以模仿 ccs.SkeletonNode:changeSkins luaval_to_std_map_string_string |
请发表评论