视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Cocos2d-x中的属性访问器
2020-11-09 08:31:56 责编:小采
文档


C的类成员只有方法与字段,没有属性和事件,这给开发者带来了不便。为了实现Objective-C中提供的属性功能,我们不得不使用方法来模拟get和set访问器。Cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在CCNode中包含大量属性,例如用于给

C++的类成员只有方法与字段,没有属性和事件,这给开发者带来了不便。为了实现Objective-C中提供的属性功能,我们不得不使用方法来模拟get和set访问器。Cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在CCNode中包含大量属性,例如用于给节点做标记的Tag属性,它的访问器分别为getTag()和setTag(int aTag),其实现原理大致如下:

int tag;

int getTag() { return tag; }

void setTag(int aTag) { tag = aTag; }

在这个例子中,属性的类型是int,处理较为简单。由于涉及内存管理,开发中我们对数值类型、结构体类型、Cocos2d-x对象的处理方法都不尽相同,这一点在读者了解2.3节介绍的Cocos2d-x内存管理后,会有更深刻的体会。

为每一个属性编写一个或两个访问器方法是一项十分枯燥的任务,为了避免重复性的工作,Cocos2d-x提供了一系列宏来帮助我们方便地创建属性。表2-1列举了所有属性相关的宏,它们定义在引擎目录中的“platform/CCPlatformMacros.h”中。
表2-1 Cocos2d-x中与属性相关的宏


描  述
CC_PROPERTY 定义一个属性及其访问器,没有实现。通常用于简单的值类型
CC_PROPERTY_READONLY 定义一个属性,只包含get访问器,没有实现
CC_PROPERTY_PASS_BY_REF 定义一个属性,访问器使用引用类型传递参数,没有实现。通常用于结构体类型
CC_PROPERTY_READONLY_PASS_BY_REF 定义一个属性,只包含get访问器,且使用引用类型传递参数,没有实现

(续)

描  述
CC_PROPERTY_READONLY_PASS_BY_REF 定义一个属性,只包含get访问器,且使用引用类型传递参数,没有实现
CC_SYNTHESIZE 同CC_PROPERTY,实现了访问器方法
CC_SYNTHESIZE_READONLY 同CC_PROPERTY_READONLY,实现了访问器方法
CC_SYNTHESIZE_PASS_BY_REF 同CC_PROPERTY_PASS_BY_REF,实现了访问器方法
CC_SYNTHESIZE_READONLY_PASS_BY_REF 同CC_PROPERTY_READONLY_PASS_BY_REF,实现了访问器方法
CC_SYNTHESIZE_RETAIN 同CC_PROPERTY,实现了访问器方法。用于派生自CCObject的类型,访问器采取Cocos2d-x的内存管理机制自动维护对象的引用计数

这些宏只要写在类的定义之中即可。每个宏都有3个参数,分别是:

varType,属性类型,如果属性类型是对象,需要写成指针的形式;

varName,属性的私有字段名称;

funName,属性的访问器名称,也就是紧接在get或set前缀后的部分。

利用Cocos2d-x提供的宏,上面的Tag属性定义就可以用下面一条语句代替了:

CC_SYNTHESIZE(int, tag, Tag)

下载本文
显示全文
专题