• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

绑定自定义c++类至Lua

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

绑定自定义类至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 必须配制的环境变量。

每个人安装引擎及相应软件位置会不一样,请确保给出正确的系统环境变量地址,切勿直接将我的拷贝至你的变量值当中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// Python 的安装路径(我采用的是默认安装 所以是在 C:\Python27)

PYTHON_ROOT:C:\Python27

 

//Java JDK 的安装路径(我采用的是默认安装 所以是在 C:\Program Files\Java\jdk1.7.0_45 )

JAVA_HOME : C:\Program Files\Java\jdk1.7.0_45

 

// 开发Android的NDK我将其解压至 C:\Android\NDK_R9B (你也可以将它解压至任务目录)

NDK_ROOT : C:\Android\NDK_R9B

 

// 开发Android的SDK 我将其解压至 C:\Android\ADT\sdk (你也可以将它解压至任务目录)

ANDROID_SDK_ROOT: C:\Android\ADT\sdk

 

// 开发Android的ANT 我将其解压至 C:\Android\ANT\bin (你也可以将它解压至任务目录)

ANT_ROOT : C:\Android\ANT\bin

以下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脚本我们生成了哪些绑定文件?我们罗列一个表单。

// Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto    

1. lua_pet_auto.hpp

// Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto

  1.  lua_pet_auto.cpp

检查这些文件是否在你的项目当中相对的路径。(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的包含路径

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua性能优化—Lua内存优化发布时间:2022-07-22
下一篇:
Error: /usr/local/share/lua/5.1/kong/cmd/start.lua:57: nginx: [emerg] bind() to ...发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap