在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),Director是整个cocos2d-x引擎的核心,是整个游戏的导航仪。游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。
因为Director是游戏项目的总导演,会经常调用进行一些控制,所以该Director利用了单件设计模式,也就是整个游戏里只有一个导演类。用getInstance() 方法取得Director的实例。
Tips:在cocos2d-x2.x的版本中使用sharedDirector()方法来获取导演类对象,而在3.x的版本中使用getInstance()来获取,不过sharedDirector()也可以使用。
Director类的继承关系如下:
DisplayLinkDirector继承CCDirector,是一个可以自动刷新的导演类。它支持60/1、1/30和1/15三种动画间隔(帧间隔)。
Director类的主要公共函数如下:
函数名 | 返回类型 | 描述 |
getRunningScene | 场景类 | 获取当前正在运行的场景 |
getAnimationInterval | 浮点型 | 获取每帧的时间 |
setAnimationInterval | 浮点型 | 设置每帧的时间 |
isDisplayStats | 布尔型 | 返回是否在屏幕左下角显示每帧的时间 |
setDisplayStats | 无 | 设置是否在屏幕左下角显示每帧的时间 |
getSecondsPerFrame | 浮点型 | 获取每帧的时间(单位为秒) |
getOpenGLView | GL视图 | 获取绘制所有对象的OpenGL视图 |
无 | 设置绘制所有对象的OpenGL视图 | |
| 布尔型 | 导演类对象是否暂停 |
整型 | 获取从导演类开始运行的帧数 | |
投影类 | 获取OpenGL投影 | |
无 | 设置OpenGL投影 | |
无 | 设置OpenGL接口 | |
布尔型 | 切换的场景是否接收清除信息 | |
节点类 | 获取一个在主场景遍历后遍历的节点对象 | |
无 | 设置一个在主场景遍历后遍历的节点对象 | |
尺寸 | 获取屏幕大小(单位为点) | |
尺寸 | 获取像素级的屏幕大小(单位为像素) | |
尺寸 | 获取可见屏幕大小 | |
矢量 | 获取可见屏幕的方向 | |
矢量 | 转化为OpenGL坐标系 | |
矢量 | 转化为UI坐标系 | |
无 | 运行当前场景 | |
无 | 挂起当前场景,压入栈中 | |
无 | 从栈中弹出场景 | |
无 | 从栈中弹出所有场景直到根场景 | |
| 无 | 从栈中弹出所有场景直到某个等级 (等级为0为导演,等级为1为根场景) |
无 | 替换当前场景 | |
无 | 结束游戏 | |
| 无 | 暂停游戏 |
| 无 | 恢复游戏 |
无 | 停止动画 | |
无 | 开始动画 | |
| 无 | 绘制场景 |
| 无 | 移除所有缓存数据 |
无 | 基于配置信息设置默认值 | |
无 | 设置OpenGL默认值 | |
无 | 设置OpenGL是否使用alpha通道 | |
| 无 | 设置是否测试OpenGL深度 |
无 | 设置表面像素大小(不同于屏幕大小) | |
浮点型 | 获取表面像素大小 | |
调度类 | 获取时间调度对象 | |
无 | 设置时间调度对象 | |
动作管理类 | 获取动作管理对象 | |
无 | 设置动作管理对象 | |
事件调度类 | 获取事件调度对象 | |
无 | 设置事件调度对象 | |
| 渲染器 | 返回渲染器 |
浮点型 | 返回控制台 | |
浮点型 | 获取帧率 |
在新建的HelloWorld项目中,打开AppDelegate.cpp,我们可以看到如下代码:
[cpp]
- //初始化函数
- boolAppDelegate::applicationDidFinishLaunching() {
- //获取导演对象
- auto director =Director::getInstance();
- //获取OpenGL视图
- auto glview = director->getOpenGLView();
- if(!glview) {
- glview = GLView::create("MyGame");
- //设置OpenGL视图
- director->setOpenGLView(glview);
- }
- // 设置显示每帧显示时间
- director->setDisplayStats(true);
- // 设置每帧时间
- director->setAnimationInterval(1.0/ 60);
- autoscene = HelloWorld::createScene();
- // 运行场景
- director->runWithScene(scene);
- return true;
- }
- // 游戏进入后台
- voidAppDelegate::applicationDidEnterBackground() {
- //停止动画
- Director::getInstance()->stopAnimation();
- }
- // 从后台返回游戏
- voidAppDelegate::applicationWillEnterForeground() {
- //开始动画
- Director::getInstance()->startAnimation();
- }
在HelloWorldScene.cpp中有:
[cpp]
- //初始化
- boolHelloWorld::init()
- {
- if ( !Layer::init() )
- {
- return false;
- }
- //获取OpenGL视图可见大小
- Size visibleSize= Director::getInstance()->getVisibleSize();
- //获取OpenGL视图可见方向
- Vec2 origin =Director::getInstance()->getVisibleOrigin();
- …………………………….
- }
- //导演类结束
- voidHelloWorld::menuCloseCallback(Ref* pSender)
- {
- #if(CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM ==CC_PLATFORM_WINRT)
- MessageBox("You pressed the close button.Windows Store Apps do not implement a close button.","Alert");
- return;
- #endif
- //导演类结束
- Director::getInstance()->end();
- #if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
由此看来,Director不愧是整个游戏的“导演”。它在游戏中无所不在,大到整个游戏的控制,小到获取屏幕的尺寸,起着至关重要的作用。