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)
    {
        // ipad
 
        if (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)。

[原创]cocos2d-x研习录-第二阶 概念类之导演类(CCDirector)的更多相关文章

  1. [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)

    节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下:     ...

  2. [原创]cocos2d-x研习录-第二阶 概念类之精灵类(CCSprite)

    上一节说布景层CCLayer是小容器,那么精灵类CCSprite就是容器添加的内容,它是构成游戏的主要元素.精灵这个名称应该是游戏专用,它表示游戏中玩家操作的主角.敌人.NPC(Non Player ...

  3. [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)

    场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...

  4. [原创]cocos2d-x研习录-第二阶 概念类之摄相机类(CCCamera)

    在Cocos2D-x中,每个CCNode都拥有一个摄像机类CCCamera.只有通过CCCamera,CCNode才会被渲染出来.当CCNode发生缩放.旋转和位置变化时,都需要覆盖CCCamera, ...

  5. [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

    上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...

  6. [原创]cocos2d-x研习录-第二阶 基本框架

    了解完Cocos2D-x的基本概念和概念类之后,是不是有一种蠢蠢欲动的冲动,想要探究Cocos2D-x是如何完成这一切的.接着我将通过对Cocos2D-x自代的HelloCpp项目进行分析,初步了解C ...

  7. [原创]cocos2d-x研习录-第二阶 基本概念

    在Cocos2D-x引擎中,有几个非常重要的概念:导演(CCDirector).摄像机(CCCamera).场景(CCSecen).布景(CCLayer).精灵(CCSPrite)和动作(CCActi ...

  8. [原创]cocos2d-x研习录—前言

    我认为很多开发者面对层出不穷的新技术.新思想和新理念,最为之苦恼的是找不到行之有效的学习方法,对于知识的本质缺乏认识,虽阅读了大量教材,却无法将其融入自己的知识体系,并搭建自己的知识树.不可否认,教材 ...

  9. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

随机推荐

  1. hdu 2177 取(2堆)石子游戏(威佐夫博奕)

    题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...

  2. DOS批处理不支持将UNC 路径作为当前目录的巧妙解决方案

    DOS批处理不支持将UNC 路径作为当前目录的巧妙解决方案在有些时候,需要在批处理中操作UNC目录,但批处理并不能直接对UNC目录进行操作,怎么办? 废话少说,直接上代码,打开网上邻居→整个网络→Mi ...

  3. CAD迷你看图

    CAD迷你看图http://www.aec188.com/CAD迷你看图 2016R12超快.超小的CAD多功能看图工具,完全脱离AutoCAD浏览R14-R2016各版本DWG/DXF/DWF的二三 ...

  4. springmvc自定义日期编辑器

    1.控制器 @Controller public class MyController { // 处理器方法 @RequestMapping(value = "/first.do" ...

  5. 求助,JS 方法调用的问题,写了返回值,确调用时返回Undefined(新人第一次写)

    文本框txtUserName 的Onbulr 绑定方法 txtUserNameOnblur  这可以正常执行 而下面的btnRegister 的click 事件则无法正常调用    txtUserNa ...

  6. Positive-definite kernel

    Definition Let be a sequence of (complex) Hilbert spaces and be the bounded operators from Hi to Hj. ...

  7. JavaAppArguments

  8. Node.js 创建HTTP服务器

    Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...

  9. mybatis进阶

    1.mybatis一对一映射 Student--Card <?xml version="1.0" encoding="utf-8" ?> <! ...

  10. CodeForces 686A-Free Ice Cream

    题目: 儿童排队领冰激凌,给你两个数n,x分别代表接下来有n行与初始的冰激淋数:接下来n行,每行有一个字符('+'or‘-’),还有一个整数d,+d表示新增的冰激 凌数(由搬运工搬运到此),-d表示儿 ...