【绑定自定义类至Lua】(三)动手绑定自定义类至Lua

来源:互联网 发布:淘宝卖盗版视频课程 编辑:程序博客网 时间:2024/06/08 11:24

看【绑定自定义类至Lua】(二)新建项目中配制环境新建项目中配制环境,我们完美的在新建项目中完成了绑定需要的环境,接下来才是最关健的一步。绑定自定义C++类至Lua。

事实上引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的工程项目。为了编辑代码方便,我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"工程。 前往项目录径“F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”,我将在这里创建一个自定义类"Pet",代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef _PET_H_
#define _PET_H_
 
#include "cocos2d.h"
 
class Pet : public cocos2d::Sprite
{
 
public:
    Pet();
    ~Pet();
 
    CREATE_FUNC(Pet);
 
public:
    bool init();
    void setPet(const std::string& filePath);
 
public:
 
    std::string name;
};
 
#endif  //_PET_H_
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "Pet.h"
 
using namespace cocos2d;
 
Pet::Pet() : name("")
{
}
 
 
Pet::~Pet()
{
}
 
void Pet::setPet(const std::string& filePath)
{
    initWithFile(filePath);
}
 
bool Pet::init()
{
    Sprite::init();
 
    return true;
}

1.jpg

2.jpg

只是一个很简单的Pet类。

1.继承于引擎定义的精灵类Sprite;

2.通过引擎定义的宏CREATE_FUNC(Pet)定义一个静态方法create();

3.两个成员函数init()、setPet();

4.具有一个数据成员name。

非常的简单,我们正是要一切从简单开始!不过需要再次提醒的是,我们是在“F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”创建了Pet类,一会我们将用到这个路径。

准备好定义C++类之后,我们再回顾一下上一小节的内容,我们在环境测试中,通过执行“genbindings.py"脚本将Cocos2d-x引擎中所有的C++类文件绑定至Lua。(虽然测试环境时,我并没有说明这点。但是实事上在最后的结果中能看到"Generating lua bindings succeeds"这样的提示,聪明的读者一定猜到了它所完成的工作就是绑定C++类至Lua)。

接下来,打开 "genbindings.py,如果你对Python语言并不熟悉。哪请忽略其它的代码,只需要把你的视线焦点集中在 133 行至 151 行

1
2
3
4
5
6
7
8
9
10
11
12
// 指定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'), \
                      ... ...
}

3.jpg

了解"genbindings.py"之后,在它的同级目录你可以找到"cocos2dx.ini",这是与之息息相关的配制文件。打开它,我们稍做了解。

4.jpg

请关注于 第 1、4、8、25 行。

还记得上面我们提到的数组吗?

1
2
3
  cmd_args  = {'cocos2dx.ini' : ('cocos2d-x''lua_cocos2dx_auto'), \
                      ... ...
    }

第 1 行就是第二个参数指定的字符内容 

第 4 行是一些条件编译 ifndef 及 生成的注册自定义类接口取名所用的前缀,前面我们已经提到过。

第 8 行是指定该绑定类的命名空间

第 25 行指定需要绑定的自定义类头文件路径

第 29 行指定绑定的C++自定义类导出后的Lua类文件名

5.jpg

了解这些之后,我们将对这两个文件进行一些修改,用于完成我们的类至Lua的绑定。

首先我们拷贝一份'cocos2dx.ini',将其命名为 'custom_pet.ini'。拷贝一份'genbindings.py',将其命名为 'custom_pet_genbindings.py'

改动'custom_pet.ini'第 1、4、8、25 行。如下:

因为我们没有指定名字空间,所以第 8 行'target_namespace'将其赋空。

'headers'当中只是相对路径的给定。还记得"Pet"类我们是创建于哪里吗?

正是在F:\Cocos2dx-Lua\Garfield\frameworks\runtime-src\Classes”。

6.jpg

OK!接下来我们改动'custom_pet_genbindings.py'。关注于第 133 至 138 行,我们将在这里做一些修改。如下:

在cmd_args参数表中,我们指定该Python绑定脚本的配制文件为我们修改好的'custom_pet.ini'。一些可能会用到的命名前缀为'custom_pet'。指定导出的桥接文件名为'lua_pet_auto'

7.jpg

8.jpg

最后,我们执行'custom_pet_genbindings.py'。 

"Generating lua bindings succeeds"!

见到它,你该欢呼了:)。你已经完成了C++自定义类至Lua的绑定。

在下一小节中,我们来探索下,怎么样在你的项目中使用Lua调用Pet类。

9.jpg

10.jpg

0 0
原创粉丝点击