出自图书《制作自己的捕鱼达人》
单例:
相对于前面的内容,单例(singleton)则是一个很易于理解的概念。在Cocos2d-x引擎中,我们能看到大量单例的身影,它们大部分出现在一些系统资源管理类中。单例模式保证了全局有且只有一个实例对象,保证自动地初始化该对象,使得程序在任何时候任何地方都可以访问、获取该对象。
例如,Cocos2d-x的游戏流程控制器CCDirector是一个独一无二的控制器,用于切换游戏场景。换句话说,不可能同时存在两个CCDirector实例。
在这种情况下,Cocos2d-x采用了单例的技巧。用户可以通过类提供的静态方法获取独一无二的实例,而不需要自己来创建。观察CCDirector的代码:
static CCDisplayLinkDirectors_SharedDirector;
CCDirector*CCDirector::sharedDirector(void)
{
static bool s_bFirstUseDirector = true;
if (s_bFirstUseDirector)
{
s_bFirstUseDirector = false;
s_SharedDirector.init();
}
return &s_SharedDirector;
}
可以发现,CCDirector维护了一个静态的CCDirector实例,在第一次使用前初始化。为了访问CCDirector控制器,我们可以使用如下代码:
CCDirector::sharedDirector()->replaceScene(newScene);
这条语句使用CCDirector::sharedDirector()获取CCDirector的唯一实例,然后调用replaceScene来切换到新场景。
属性:
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”中。