CCDirector类是游戏的组织和控制中心(总指挥),它控制着主屏幕的显示、场景的切换和显示,以及游戏的开始、结束和暂停。它的继承关系图如下:
CCDirector继承自基类CCObject,它还有一个子类CCDisplayLinkDirector,它是一个可以自动刷新的CCDirector。CCDirector包括的核心功能如下:
·初始化OpenGL和设置OpenGL参数;
·控制场景管理和切换;
·设置Cocos2D的配置细节;
·访问视图(OpenGL、UIView、UIWindow)
下面查看一下,CCDirector的内部结构和功能:
·CCDirector属性:
CCScene* m_pRunningScene:当前运行的场景
CCScene* m_pNextScene:下一个将要运行的场景
CCArray* m_pobScenesStack:场景堆栈指针
CCScheduler* m_pScheduler:支持调度
CCActionManager* m_pActionManager:支持动作管理
CCTouchDispatcher* m_pTouchDispatcher:触屏事件分发
CCKeypadDispatcher* m_pKeypadDispatcher:支持键盘
CCAccelerometer* m_pAccelerometer:支持加速度传感器
bool m_bPaused:是否暂停游戏
float m_fDeltaTime:帧间隔的时间
CCSize m_obWinSizeInPoints:坐标点型的屏幕尺寸
CCSize m_obWinSizeInPixels:像素级的屏幕尺寸
·CCDirector方法:
CCScene* getRunningScene(void):获取当前运行的场景
double getAnimationInterval(void):获取当前FPS(表示帧数,60是一般游戏的常用帧数)
void setAnimationInterval(double dValue):设置FPS
bool isDisplayStats(void):屏幕左下角是否显示每帧的时间
void setDisplayStats(bool bDisplayStats):设置在屏幕左下角显示每帧的时间
float getSecondsPerFrame():获取每帧的时间
CCEGLView* getOpenGLView(void):获取绘制所有对象的OpenGL视图
setOpenGLView(CCEGLView *pobOpenGLView):设置绘制所有对象的OpenGL视图
void setGLDefaultValues(void):将OpenGL参数设置为默认值
void setAlphaBlending(bool bOn):设置OpenGL是否使用Alpha通道
bool isPaused(void):CCDirector对象是否暂停
unsigned int getTotalFrames(void):获取运行的总帧数
ccDirectorProjection getProjection(void):获取OpenGL的投影
setProjection(ccDirectorProjection kProjection):设置OpenGL的投影
bool isSendCleanupToScene(void):场景替换时,是否接收到cleanup时间,若新的的场景是被push进来的,旧的场景不会收到cleanup 事件,若新的场景是被替换进来的,旧的场景就能够收到cleanup事件。
CCSize getWinSize(void):获取OpenGL视图屏幕大小(单位/点)
CCSize getWinSizeInPixels(void):获取OpenGL视图屏幕大小(单位/像素)
CCSize getVisibleSize():获取可视区域大小
CCPoint getVisibleOrigin():获取可视区域起点
void reshapeProjection(const CCSize& newWindowSize):改变投影的大小
CCPoint convertToGL(const CCPoint& obPoint):将世界坐标系转化为OpenGL坐标系
CCPoint convertToUI(const CCPoint& obPoint); 将OpenGL坐标系转化为世界坐标系
void runWithScene(CCScene *pScene):运行场景
void pushScene(CCScene *pScene):场景压栈
void popScene(void):场景出栈
void popToRootScene(void):弹出所有场景,至到根场景
void replaceScene(CCScene *pScene):替换场景
void end(void):结束游戏
void pause(void):暂停游戏
void resume(void):恢复游戏
void mainLoop(void):游戏主循环
void stopAnimation(void):停止动画
void startAnimation(void):开始动画
void drawScene(void):绘制场景
void purgeCachedData(void):清除缓存数据
void setDepthTest(bool bOn):设置是否测试景深
以上这些就是CCDirector的主要属性和方法。需要提及的是,CCDirector是单例模式,这样在代码任何地方都可以调用CCDirector从而控制游戏。在Cocos2D-x中,在游戏的任何时间,只有一个场景对象实例处于运行状态,CCDirector负责游戏全过程的场景切换。其实,这是一种典型的面向对象和分层的设计原则,目的是减少对象之间的关系。
既然CCDirector是游戏的控制中心,那么在游戏初始化的时候肯定会调用CCDirector,代码如下:
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());TargetPlatform target = getTargetPlatform();
if (target == kTargetIpad)
{
// ipadif (pDirector->enableRetinaDisplay(true))
{
// ipad hd
CCFileUtils::sharedFileUtils()->setResourceDirectory("ipadhd");
}
else
{
CCFileUtils::sharedFileUtils()->setResourceDirectory("ipad");
}
}
else if (target == kTargetIphone)
{
// iphone
if (pDirector->enableRetinaDisplay(true))
{
// iphone hd
CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");
}
}// turn on display FPS
pDirector->setDisplayStats(true);// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);CCScene * pScene = CCScene::create();
CCLayer * pLayer = new TestController();
pLayer->autorelease();pScene->addChild(pLayer);
pDirector->runWithScene(pScene);return true;
}
这段代码的applicationDidFinishLaunching函数在程序App初始化时会被调用,CCDirector一般被调用,完成一些游戏的初始化和设置工作。
再次强调,CCDirector是Cocos2D-x的控制类,它的作用和功能需要非常熟悉,才能在开发过程中得心应手。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
注:本人在本博客的原创文章采用创作共用版权协议(http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。