Cocos2d-x学习笔记(四)之 导演类CCDirector
今天来学习cocos2d-x中非常重要的一个类,它管理整个游戏的开始、结束、暂停等,可以说它就是我们游戏的总指挥,那么它就是我们的导演类CCDirector。下面让我们一起来学习一下导演类CCDirector。
CCDirector类是Cocos2d-x游戏引擎的核心,它用来创建并且控制着主屏幕的显示,同时控制场景的显示时间和显示方式。在整个游戏里一般只有一个导演。游戏的开始、结束、暂停都会调用CCDirector类的方法。CCDirector类具有如下功能:
1)初始化OpenGL会话。
2)设置OpenGL的一些参数和方式。
3)访问和改变创景以及访问Cocos2d-x的配置细节。
4)访问视图。
5)设置投影和朝向。
需要说明的是:CCDirector是单例模式,调用CCDirector的方法的标准方式如下:
1 CCDirector::sharedDirector()->函数名
CCDirector类的继承关系如下:
CCDisplayLinkDirector-->CCDirector-->CCObject-->CCCopying。
CCDisplayLinkDirector继承了CCDirector,是一个可以自动刷新的导演类。它只支持1/60、1/30和1/15三种动画间隔(帧间隔)。
在Cocos2d-x里面,在游戏的任何时间,只有一个场景对象实例处于运行状态,而导演就是流程的总指挥,它负责游戏全过程的场景切换,也也是典型的面向对象和分层的设计原则。下面分别介绍CCDirector类的成员数据和方法。
成员数据:CCDirector类没有公共的成员数据,保护成员数据如下:
m_pScheduler :绑定导演类的调度对象。
m_pActionManager :绑定导演类的动作管理对象。
m_pTouchDispatcher :绑定导演类的触屏调度对象。
m_pKeypadDispatcher :绑定导演类的键盘调度对象。
m_pAccelerometer :绑定导演类的加速度传感器对象。
m_bPaused :导演是运行还是暂停。
m_pRunningScene :正在运行的场景类。
m_pNextScene :下一个场景类。
m_fDeltaTime :帧间隔的时间。
m_obWinSizeInPoints :坐标点型的屏幕尺寸。
m_obWinSizeInPixels :像素级的屏幕尺寸。
成员函数:
getRunningScene:获得当前正在运行的场景。
getAnimationInterval:获得每帧的时间。
setAnimationInterval:设置每帧的时间。
isDisplayStats:返回是否在屏幕左下角显示每帧的时间。
setDisplayStats:设置是否在屏幕左下角显示每帧的时间。
getSecondsPerFrame:获得每帧的时间(单位为秒)。
getOpenGLView:获得绘制所有对象的OpenGL视图。
setOpenGLView:设置绘制所有对象的OpenGL视图。
isPaused:获得导演类对象是否暂停。
getTotalFrames:获得从导演类开始运行的帧数。
getProjection:获得OpenGL的投影。
setProjection:设置OpenGL的投影。
getNotificationNode:获得一个节点对象,这个节点对象在主场景被遍历后被遍历。
enableRetinaDisplay:是否是视网膜版的显示。
getWinSize:获得屏幕大小(单位为点)。
getWinSizeInPixels:获得像素级的屏幕大小,单位为像素,只是视网膜版本遇上一个返回值不同。
reshapeProjection:改变投影的大小。
convertToGL:从UI体系的坐标转换为OpenGL的坐标。
convertToUI:从OpenGL的坐标转换为UI体系的坐标。
runWithScene:运行当前的场景。
popScene:弹出当前场景,将它从栈顶弹出。
pushScene:悬挂当前场景,压入栈中。
popToRootScene:弹出所有场景,直到根场景。
replaceScene:替换当前场景。
end:结束游戏。
pause:暂停游戏。
resume:重启被暂停的场景,被暂停的时间调度也重新激活。
stopAnimation:停止动画。
startAnimation:开始动画。
drawScene:绘制场景。
prugeCachedData:清除缓存数据。
setGLDefaultValues:将OpenGL参数设置为默认值。
setAlphaBlending:设置OpenGL是否采用Alpha通道。
setDepthTest:设置是否测试景深。
getTouchDispatcher:获得触屏调度对象。
setTouchDispatcher:设置触屏调度对象。
getKeypadDispatcher:获取键盘调度。
setKeypadDispatcher:设置键盘调度。
getAccelerometer:获得加速度传感器。
setAccelerometer:设置加速度传感器。
getActionManager:获得动作管理对象。
setActionManager:设置动作管理对象。
getScheduler:获得调度对象。
setScheduler:设置调度对象。
下面来看一下CCDirector类的使用:
CCDirector类在游戏初始化中的应用
1 //获得导演类
2 CCDirector* pDirector = CCDirector::sharedDirector();
3 CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
4
5 //设置OpenGL视图
6 pDirector->setOpenGLView(pEGLView);
7
8 //设置是否显示每帧时间
9 pDirector->setDisplayStats(true);
10
11 // 设置每帧时间
12 pDirector->setAnimationInterval(1.0 / 60);
13
14 // 创建场景
15 CCScene *pScene = HelloWorld::scene();
16
17 // 运行场景
18 pDirector->runWithScene(pScene);
在游戏进入后台或者从后台返回时,分别调用相应的方法停止动画和开始动画:
1 //停止动画
2 void AppDelegate::applicationDidEnterBackground() {
3 CCDirector::sharedDirector()->stopAnimation();
4 }
5
6 // 开始动画
7 void AppDelegate::applicationWillEnterForeground() {
8 CCDirector::sharedDirector()->startAnimation();
9 }
在手机由外部事件进入时,也会将当前界面暂停,比如来电话时:
1 //暂停场景
2 CCDirector::sharedDirector()->pause();
3
4 //重启被暂停的场景
5 CCDirector::sharedDirector()->resume();
在游戏结束的时候,同样需要使用导演类来结束,如下:
1 //结束游戏
2 CCDirector::sharedDirector()->end();
3
4 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
5 exit(0);
6 #endif
从以上的所有信息中可以看出,导演类就是一个管理游戏的指挥官,导演类就先介绍到这里,当然之后还会接触到一些CCDirector类的用法,比如:坐标的转换等。