CCDirector导演类

CCDirector类是Cocos2D-x游戏引擎的核心。它用来创建而且控制着屏幕的显示,同一时候控制场景的显示时间和显示方式。

在整个游戏里一般仅仅有一个导演。游戏的開始、结束、暂停都会调用CCDirector类的方法。CCDirector类具有例如以下功能。

  • 初始化OpenGL会话。
  • 设置OpenGL的一些參数和方式。
  • 訪问和改变场景以及訪问Cocos2D-x的配置细节。
  • 訪问视图。
  • 设置投影和朝向。

须要说明的是,CCDirector是单例模式,调用CCDirector方法的标准方式例如以下:

  • CCDirector::sharedDirector()->函数名

CCDirector类的继承关系。如图3-8所看到的。

CCDisplayLinkDirector继承了CCDirector,是一个能够自己主动刷新的导演类。它仅仅支持1/60 、1/30 和1/15三种动画间隔(帧间隔)。在Cocos2D-x里面。在游戏的不论什么时间,仅仅有一个场景对象实例处于执行状态。而导演就是流程的总指挥,它负责游戏全过程的场景切换。这也是典型的面向对象和分层的设计原则。以下分别介绍CCDirector类的成员数据和函数。

先看返回单例对象的方法

Director* Director::getInstance(){
if (!s_SharedDirector)
{
s_SharedDirector = new DisplayLinkDirector();
s_SharedDirector->init();
}
return s_SharedDirector;}

注意,返回的是DisplayLinkDirector这个类。而且在创建完 DisplayLinkDirector对象之后调用了init方法,看一下init方法。

从这种方法里面我们再一次了解一下,Director详细都能干什么,和一些内部初始化的工作是怎么完毕的

bool Director::init(void){
setDefaultValues();
// scenes
_runningScene = nullptr;
_nextScene = nullptr;
_notificationNode = nullptr;
_scenesStack.reserve(15);
// FPS
_accumDt = 0.0f;
_frameRate = 0.0f;
_FPSLabel = _drawnBatchesLabel = _drawnVerticesLabel = nullptr;
_totalFrames = _frames = 0;
_lastUpdate = new struct timeval;
// paused ?
_paused = false;
// purge ?
_purgeDirectorInNextLoop = false;
_winSizeInPoints = Size::ZERO;
_openGLView = nullptr;
_contentScaleFactor = 1.0f;
// scheduler
_scheduler = new Scheduler();    

// action manager
_actionManager = new ActionManager();
_scheduler->scheduleUpdate(_actionManager, Scheduler::PRIORITY_SYSTEM, false);
_eventDispatcher = new EventDispatcher();
_eventAfterDraw = new EventCustom(EVENT_AFTER_DRAW);
_eventAfterDraw->setUserData(this);
_eventAfterVisit = new EventCustom(EVENT_AFTER_VISIT);
_eventAfterVisit->setUserData(this);
_eventAfterUpdate = new EventCustom(EVENT_AFTER_UPDATE);
_eventAfterUpdate->setUserData(this);
_eventProjectionChanged = new EventCustom(EVENT_PROJECTION_CHANGED);
_eventProjectionChanged->setUserData(this);    

//init TextureCache
initTextureCache();    

_renderer = new Renderer;

#if (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) && (CC_TARGET_PLATFORM != CC_PLATFORM_WP8)
_console = new Console;
#endif
return true;}

能够看到。Director这个大管家初始化了 ActionManager 动作管理器,并将 _actionManager加到了定时器里。初始化了EventDispatcher EventCustom 等事件。初始化了纹理 和渲染器 Rendere。

以下我们再看一下DisplayLinkDirector这个类。这是Director的实体类。

class DisplayLinkDirector : public Director
{
public:
 DisplayLinkDirector(): _invalid(false){}   

//
// Overrides
//
virtual void mainLoop() override;
virtual void setAnimationInterval(double value) override;
virtual void startAnimation() override;
virtual void stopAnimation() override;

protected:
 bool _invalid;};

这个类实现了Director的几个关键的虚函数。mainLoop这个是最基本的了,上面我们一再说逻辑循环,事实上都是指这个函数。全部的操作,动画,渲染。定时器都在这里驱动的。游戏主循环里重复的调度 mainLoop来一帧一帧的实现游戏的各种动作。动画……. mainLoop来决定当前帧该运行什么。是否到时间运行等等。

void DisplayLinkDirector::mainLoop()
{
if (_purgeDirectorInNextLoop){
     _purgeDirectorInNextLoop = false;
     purgeDirector();
   }else if (!_invalid)
       {drawScene();
       // release the objects
       PoolManager::getInstance()->getCurrentPool()->clear();
       }
}

代码非常easy,依据对 purgeDirectorInNextLoop 推断来决定mainLoop是否应该清除。

_invalid来决定 Director是否应该进行逻辑循环。

这段代码非常easy,主要操作都封闭到了 drawScene里面后面我们跟进drawScene来看看每一个逻辑帧都干了些什么。

后面另一句代码:PoolManager::getInstance()->getCurrentPool()->clear();

从命名上来看是做清除操作,应该是内存操作,每帧回收不用的引用对象应该是在这里触发的,我们在内存应用的章节再回过头来讨论这块。

以下看drawScene的代码

void Director::drawScene(){    

// 计算帧之间的时间间隔,以下依据这个时间间隔来推断是否应该进行某某操作
calculateDeltaTime();        

// skip one flame when _deltaTime equal to zero.
if(_deltaTime < FLT_EPSILON) {return;}
if(_openGLView){_openGLView->pollInputEvents();}    

//Director没有暂停的情况下,更新定时器。分发 update后的消息
if(!_paused){
_scheduler->update(_deltaTime);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);}  

// opengl清理
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    

/*设置下个场景*/
if (_nextScene){
setNextScene();}    

kmGLPushMatrix();    

// global identity matrix is needed... come on kazmath!
kmMat4 identity;
kmMat4Identity(&identity);  

// 渲染场景
if (_runningScene)
{_runningScene->visit(_renderer, identity, false);

// 分发场景渲染后的消息
_eventDispatcher->dispatchEvent(_eventAfterVisit);}    

// 渲染notifications 结点,这个结点有什么用如今还看不太清楚,后面章节我们一定会摸清楚的    

if (_notificationNode){_notificationNode->visit(_renderer, identity, false);    }
if (_displayStats){showStats();}    // 渲染 FPS等帧频显示
_renderer->render();     // 调用了渲染器的render方法。详细我们在分析Render类的时候再回过来看都干了些什么   

_eventDispatcher->dispatchEvent(_eventAfterDraw); 

kmGLPopMatrix();
_totalFrames++;    

// swap buffers
if (_openGLView){_openGLView->swapBuffers();}
if (_displayStats){calculateMPF();}

}

到如今,我们完整的分析了Director类,了解了这个大管家都管理了哪些对象。

以下我们做个总结。Director主要管理了场景,四个事件的分发,渲染, Opengl对象等。它主要是以场景为单位来控制游戏的逻辑帧,通过场景的切换来实现游戏中不同界面的变化。mainloop这个函数调用了drawscene来实现每一帧的逻辑,主要是渲染逻辑。

时间: 2024-11-18 13:45:32

CCDirector导演类的相关文章

cocos2dx 2.2.3笔记 - CCDirector导演类

导演类创建和操作主窗口,并且管理什么时候创建并执行场景(CCSene).导演类同时还负责 OpenGl的相关创建( 因为目前水平有限,对Opengl不甚理解,学习后补充 ). 导演类是一个单例模式类. 主要成员变量: CCEGLView* m_pobOpenGLView; 所有东西渲染处理的类 CCScene* m_pRunningScene;当前运行的场景 CCScene* m_pNextScene;下一帧要运行的场景 bool m_bSendCleanupToScene;true则发送旧场景

导演类

导演类Director用于管理场景对象,采用单例设计模式,在整个工程中只有一个实例对象.由于是单例模式,能够保存一致的配置信息,便于管理场景对象.获得导演类Director实例语句如下: local director = cc.Director:getInstance() 其中cc是Cocos2d-x Lua中类的命名空间,Director是导演类,getInstance()函数获得调用实例. 导演对象职责如下: 访问和改变场景 访问配置信息 暂停.继续和停止游戏 转换坐标 它有一个子类是Dis

cocos2dx 3.17.1 导演类

进入导演类的头文件,首先看到的是一些头文件的引用:CCPlatformMacros(适配),CCRef(继承的父类),CCVector(3.0以后的新向量),CCScene(场景),CCMath(数学方法),CCGL(OpenGL):接下来是一堆类的声明:LabelAtlas(标签),DirectorDelegate(不知道),Node(节点),Scheduler(调度器),ActionManager(动作管理器),EventDispatcher(时间分发),EventCustom(自定义事件)

初学Cocos2dx

初学cocos2dx Cocos2dx 中的主要概念包括:应用.导演.场景.层.精灵.动画.动作. Cocos2dx里面的主要类 1.CCObject Object Object Object 是cocos2dx的主要基类.主要提供了引用计数的功能. 2.CCPoolManager CCPoolManager CCPoolManager CCPoolManager 是个单体类,负责管理多个垃圾回收器 CCAutoreleasePool 在CCObject::Autorelease方法中单体CCP

第三十七天 一乐在当中—Android的小游戏打飞机(一)环境搭建

8月3日,晴天."绿树阴浓夏日长.楼台倒影入池塘. 水晶帘动微风起,满架蔷薇一院香. " cocos2d是一个开源的游戏开发框架.利用它能够非常easy的开发2D游戏.眼下最基本的分支是iPhone版本号的,你能够在iPhone上开发2D游戏. 它提供了物理.精灵(sprites).视差卷轴(parallax scrolling),支持iPhone touch和accelerator等非常多功能.如今在App Store上已经有不少用cocos2d开发的游戏. 假设你想在Andriod

Cocos2D-x中的核心类【1】

Cocos2D-x引擎的设计思路是将游戏的各个部分抽象成几个概念,包括导演.场景.布景层和人物精灵. 几乎任何一款游戏中都会有这些概念,而游 戏的复杂程度也就决定这些部分之间的关系的复 杂程度.具体说明如下: ?导演(CCDirector):顾名思义,导演类是 游戏中的组织者和领导者,是整个游戏的负责人.总指挥.导演类可以制定游戏的运行规则,从而让游戏内的场景.布景类和精灵类有序地进行. ?场景(CCScene):场景就是一个关卡,或者是一个游戏界面.这样的一个一个场景确定了整个的游戏. ?布景

Cocos2D学习笔记(1)- 常用的类

1.坐标系 >屏幕坐标系(UIKit):原点在左上角! >OpenGl坐标系:原点在屏幕的左下角! 2.游戏设计:Director--Scene--Layer--Sprite. >CCDirector:导演类,相当于是游戏策划,负责整个游戏的布局和运行规则的制定. >CCScene:场景类,每个场景可以是一个界面或一个关卡. >CCLayer:图层类,为了方便游戏界面的渲染管理. >CCSprite:精灵类, 小结:一个导演类(CCDirector)可以指挥多个场景类(

【cocos2d-x学习笔记】导演,场景,层,精灵模型

CCDirector导演 单例类,通过CCDirector::sharedDirector函数去获取导演对象 CCDirector* d = new CCDirector() // error,单例对象不应该自己去创建 1)导演负责初始化环境 2)导演负责推动游戏进程 runWithScene, replaceScene, pushScene, popScene 3) 导演负责坐标变换 CCScene 场景:一幕戏 从cocos2dx数据结构来收,它是一个渲染树的根节点 任一时刻,只有一个Sce

UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView

? 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的处理,都已经有人做好了这些工作,并将其封装到框架中,其中Cocos2d-android就是这样一个框架. Cocos2d实现游戏的绘制: 1.实现步骤: 首先来说,要想绘制出游戏界面,按照谷歌文档中的说明,需要实现两步操作: ①.所有的SurfaceView和SurfaceHolder.Callba