在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
绑定自定义类至lua【1】 * 确定你安装了Android NDK R9B 版本 ,如果没有前往下载。 * 下载Python2.7.3 (32bit),并保证它被正确安装。 * 为Python设置用户变量,"系统"->(右健)属性->"高级系统设置"->环境变量->在用户变量栏加入附一中的系统变量。 * 下载pyyaml ,并安装。 * 下载pyCheetah , 并解压至 "C:\Python27\Lib\site-packages"。 * 检查是否正确设置如 (附一)中 的环境变量(`NDK_ROOT`)的值。 * 检查你的绑定环境。进入引擎 "cocos2d-x/tools/tolua" 目录,并执行 "genbindings.py", 剩下的工作交给该Python来将我们的引擎绑定至Lua。如果看到了 "Generating lua bindings succeeds.",那说明你的环境配制好了。 附一 配制系统环境(见图) Cocos2d-x 3.3 与 Quick-Cocos2d-x 3.3 必须配制的环境变量。 每个人安装引擎及相应软件位置会不一样,请确保给出正确的系统环境变量地址,切勿直接将我的拷贝至你的变量值当中。
以下4个变量值在你运行Cocos2d-x3.3 "stepup.py(在引擎根目录下)"正确配制Cocos2d-x3.3引擎后,将会为你自动加入的系统变量,注意我在Path中加入了"C:\Python27;"。 COCOS_CONSOLE_ROOT: D:\cocos2d-x-3.3\tools\cocos2d-console\bin COCOS_TEMPLATES_ROOT: D:\cocos2d-x-3.3\templates COCOS_X_ROOT: D:\cocos2d-x-3.3 Path: C:\Python27;D:\cocos2d-x-3.3\templates;D:\cocos2d-x-3.3\tools\cocos2d-console\bin
如果能看到这张图,说明你环境配制好了,跟着我前往下一步吧。 绑定自定义类至lua【2】 (这一步我没有遇到直接跳过了) 在《【绑定自定义类至Lua】(一)环境搭建》中,为何最后一步是在Quick引擎中去完成绑定C++至Lua的脚本呢? 原因是引擎帮我们设置好了引擎已有类文件绑定的一系列环境,但是我们不可能在引擎的源模版中去开发我们的项目,而是通过引擎模版创建我们自已独立的新项目,而当我们创建自已的新项目时,我们知道,新的项目会从源模版引擎中,将一些可能用到的引擎构成拷贝至新的项目中去(比例说引擎源码、一些lib库之类),但是有些构成却不会拷贝。一会我们将碰到这样的问题。 接下来,我们需要创建一个Quick-Cocos2d-x 3.3的项目。这里需要你查找相关资料完成该工程的创建(实事上,这是件很容易的事情)。正如你看到的,我在 " F:\Cocos2dx-Lua\Garfield "这个目录创建Quick工程。并且进入至“ F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\tools\tolua ”。同样我们看到了 “genbindings.py”这个绑定脚本。让我们试着执行一下看看。碰到问题了 “dos2unix 不是内部或外部命令... ... ”。 如果你也碰到了下面这个问题,哪正好解释了我上面提到的,"新的项目会把一些可能用到的引擎构成,拷贝至新的项目(比例说引擎源码、一些lib库之类),但是有些构成却不会拷贝。"在创建新的项目时,“dos2unix.exe"就没有被拷贝至我们新的项目,别着急,会有办法解决它!如图从Quick源引擎该路径拷贝”dos2unix.exe“至创建的项目相对应的路径。 这是引擎的位置 这里是我们将要拷贝的项目目标路径(现在没有发现”dos2unix.exe“)
拷贝完成之后,我们再次执行 "genbindings.py"。完美执行该绑定脚本!你完成了很重要的第二步,确保你自已创建的新项目,绑定脚本的环境也是正确的! 接下来跟着我进入第三大步吧! 绑定自定义类至lua【3】 我们完美的在新建项目中完成了绑定需要的环境,接下来才是最关健的一步。绑定自定义C++类至Lua。 事实上引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的工程项目。为了编辑代码方便,我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"工程。 前往项目录径“F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”,我将在这里创建一个自定义类"Pet",代码如下。 只是一个很简单的Pet类。
1.继承于引擎定义的精灵类Sprite; 2.通过引擎定义的宏CREATE_FUNC(Pet)定义一个静态方法create(); 3.两个成员函数init()、setPet(); 4.具有一个数据成员name。 非常的简单,我们正是要一切从简单开始!不过需要再次提醒的是,我们是在“F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”创建了Pet类,一会我们将用到这个路径。 接下来,打开 "genbindings.py,如果你对Python语言并不熟悉。哪请忽略其它的代码,只需要把你的视线焦点集中在 133 行至 151 行。 // 指定tolua所在的录径 无需修改 tolua_root = '%s/tools/tolua' % project_root
// 指定绑定脚本执行后,产生的绑定一系列文件输出保存于何路径 // 虽然无需修改,但是我们要记住,我们产生的绑定文件是输出于 //"F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto" output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root
// 这个数组中指定了要执行绑定脚本的一些配制参数 ,看到第一行,'cocos2dx.ini' 是一个配制文件,我们可以在"genbindings.py"同级目录中找到它。‘cocos2d-x’实际上是在 'cocos2dx.ini' 配制文件中的第一行所指定的一个字符常量,主要是用于生成绑定桥接文件时,为诸如条件编译 ifndef 及 生成的注册自定义类接口取名所用。一会我将会在后面稍提这点,这里如果不明白,请暂时忽略它。‘lua_cocos2dx_auto’是给生成的绑定桥接文件指定的言语件名。 cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \......}
了解"genbindings.py"之后,在它的同级目录你可以找到”cocos2dx.ini“,这是与之息息相关的配制文件。打开它,我们稍做了解。 请关注于 第 1、4、8、25 、29行。还记得上面我们提到的数组吗? cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \ ... ... } 第 1 行就是第二个参数指定的字符内容 第 4 行是一些条件编译 ifndef 及 生成的注册自定义类接口取名所用的前缀,前面我们已经提到过。 第 8 行是指定该绑定类的命名空间 第 25 行指定需要绑定的自定义类头文件路径 第29行 指定绑定的C++自定义类导出后的Lua类文件名 了解这些之后,我们将对这两个文件进行一些修改,用于完成我们的类至Lua的绑定。 首先我们拷贝一份'cocos2dx.ini',将其命名为 'custom_pet.ini'。拷贝一份'genbindings.py',将其命名为 'custom_pet_genbindings.py'。 改动'custom_pet.ini'。如下: 因为我们没有指定名字空间,所以第 8 行'target_namespace'将其赋空。 而'headers'当中只是相对路径的给定。还记得"Pet"类我们是创建于哪里吗? 正是在F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”。
OK!接下来我们改动'custom_pet_genbindings.py'。关注于第 133 至 138 行,我们将在这里做一些修改。如下: 在cmd_args参数表中,我们指定该Python绑定脚本的配制文件为我们修改好的'custom_pet.ini'。一些可能会用到的命名前缀为'custom_pet'。指定导出的桥接文件名为'lua_pet_auto'。
最后,我们执行'custom_pet_genbindings.py'。 "Generating lua bindings succeeds"! 见到它,你该欢呼了:)。你已经完成了C++自定义类至Lua的绑定。 在下一小节中,我们来探索下,怎么样在你的项目中使用Lua调用Pet类。 注: 1、其实,说白了就是 custom_pet_genbindings.py 需要生成的桥接文件路径及名字 custom_pet.ini 需要绑定的自定义c++类的路径及名字 需要将源文件删除一部分code 2、在每次执行*.py的时候,首先将路径定义到相对应的目录cd /+路径 下在将*.py拖进命令窗口中 绑定自定义类至lua【4】 动手绑定自定义类至Lua 之后,我们已经完成了自定义类至Lua的绑定。在接下来的环节,我们将使用它。 首先,我们需要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单。
检查这些文件是否在你的项目当中相对的路径。(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的包含路径
|
请发表评论