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. 12款最佳Linux命令行终端工具, 20款优秀的 Linux 终端仿真器

    12款最佳Linux命令行终端工具     如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的 ...

  2. 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...

  3. JDBC连接sql server数据库及其它

    JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的 ...

  4. 【Todo】网络编程学习-面向工资编程

    https://zhuanlan.zhihu.com/p/20204159 这个系列真的非常好,好好领会学习一下

  5. jquery中通过全局变量来禁止多次ajax请求

    var ajaxstate=false;//定义全局变量,通过这个变量来获得当前的ajax状态 $(function(){ $(document).ajaxStart(function(){ $(&q ...

  6. nginx location配置

    nginx location配置   location在nginx中起着重要作用,对nginx接收到的请求字符串进行处理,如地址定向.数据缓存.应答控制.代理转发等location语法location ...

  7. oracle sql 优化

    2. 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先 ...

  8. express-generator安装时出错,最后用VPS解决

    npm install -g express-generator npm ERR! Linux 3.10.0-229.el7.x86_64npm ERR! argv "/usr/local/ ...

  9. Linux编程之驱动

    增加自己写的驱动程序:http://blog.chinaunix.net/uid-23065002-id-115739.html http://os.51cto.com/art/201108/2840 ...

  10. Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...