在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] view plain copy
- //初始化函数
- 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] view plain copy
- //初始化
- 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不愧是整个游戏的“导演”。它在游戏中无所不在,大到整个游戏的控制,小到获取屏幕的尺寸,起着至关重要的作用。