cocos2d-x是一个开源的跨平台游戏引擎,csdn上有很多很好的学习资料分享,这里便不详细讲述。
开源的引擎有很多的好处,其中之一就是可以个人对引擎进行修改,增添适合的特性和功能,增强独特性。这样就不会出现同一引擎做出来的游戏都是相仿的窘况。但是要对引擎进行修改,当然首先要深入学习一下引擎的内部功能。这又可以引出开源的另一个好处,我们可以通过浏览引擎的源代码,学习别人的优点。
因为cocos2d-x是从obj-C移植成C++,里面运用了大量的设计模式,这里先介绍最简单的设计模式——单例模式(Singleton)。
单例模式:
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
原因:在一个系统中,通常需要进行全局调控,单例模式比全局变量/全局函数有更优越的特点
1. 通过封装,严格控制客户的访问和隐藏易出错的数据及数据操作
2. 防止命名空间污染,单例模式是对全局变量改进,避免全局变量污染命名空间
3. 对全局变量进行封装,增强的程序的可读性
4. 易于拓展,可以通过继承单件类,对全局操作进行新变化
实现方法:
类声明如下
class Singleton {
private:
static Singleton* m_singleton;
Singleton();
public:
static Singleton* getInstance();
};
单件类中储存着该单例的静态指针,通过私有的构造函数限制用户创建新的实例,而getInstance()返回单件类实例
实现方式如下
Singleton* Singleton::m_singleton = NULL;
Singleton() {}
Singleton* getInstance() {
if (m_singleton == NULL) {
m_singleton = new Singleton();
}
return m_singleton;
}
单例模式的介绍到此为止,上述就是单例模式的基本框架,当然还需要大家根据不同情况进行增加它的方法。
下面我们来看看cocos2d-x哪里运用了单例模式。
通过查看cocos2d-x源代码的头文件,我们很容易就能发现cocos2d-x中的单件类通过sharedxxxxx()(等价于上述例子中的getInstance)来获取单件类实例。
稍稍搜索就能够找到CCDirector、CCShaderCache、CCScriptEngineManager等都是单件类,现在我们仔细看看CCDirector的代码
//CCDirector.cpp
......
......
static CCDisplayLinkDirector *s_SharedDirector = NULL;
#define kDefaultFPS 60 // 60 frames per second
extern const char* cocos2dVersion(void);
CCDirector* CCDirector::sharedDirector(void)
{
if (!s_SharedDirector)
{
s_SharedDirector = new CCDisplayLinkDirector();
s_SharedDirector->init();
}
return s_SharedDirector;
}
查看CCDirector.cpp,令人意外的是单件类实例是全局静态成员而不是类中的私有静态变量。这岂不是可以全局访问得到,或许是有别的用意我还没看懂?
不过单件类的静态成员方法倒是中规中矩,没有什么特别之处。
至于CCDisplayLinkDirector,不用看头文件也能知道是CCDirector的子类,有兴趣的可以自己翻看一下CCDirector.h
关于cocos2d-x的单例模式就交流到这里,本人也是初学cocos2d-x,有问题的可以评论交流,互相进步,谢谢