cocos2dx 3.17.1 导演类
进入导演类的头文件,首先看到的是一些头文件的引用:CCPlatformMacros(适配),CCRef(继承的父类),CCVector(3.0以后的新向量),CCScene(场景),CCMath(数学方法),CCGL(OpenGL);接下来是一堆类的声明:LabelAtlas(标签),DirectorDelegate(不知道),Node(节点),Scheduler(调度器),ActionManager(动作管理器),EventDispatcher(时间分发),EventCustom(自定义事件),EventListenerCustom(自定义事件监听),TextureCache(纹理缓存),Renderer(渲染队列),Camera(相机),Console(控制台),FrameBuffer(帧缓存);把OpenGL的类屏蔽掉了,可能是在别的渲染管理类中,后面分析渲染机制再看
#ifndef __CCDIRECTOR_H__
#define __CCDIRECTOR_H__ #include <stack>
#include <thread>
#include <chrono> #include "platform/CCPlatformMacros.h"
#include "base/CCRef.h"
#include "base/CCVector.h"
#include "2d/CCScene.h"
#include "math/CCMath.h"
#include "platform/CCGL.h"
#include "platform/CCGLView.h" NS_CC_BEGIN /**
* @addtogroup base
* @{
*/ /* 提前声明. */
class LabelAtlas;
//class GLView;
class DirectorDelegate;
class Node;
class Scheduler;
class ActionManager;
class EventDispatcher;
class EventCustom;
class EventListenerCustom;
class TextureCache;
class Renderer;
class Camera; class Console;
namespace experimental
{
class FrameBuffer;
}
之后看到导演类的定义,是继承于Ref父类的,进入父类查看它的作用,进入父类发现它的代码量并不多,有几个关键的函数retain(),release(),autorelease(),他们的作用在这个类中也很明显,就是cocos2dx的内存管理机制--计数机制;当对象被生成出来,就会被加入到对象池,计数为1,如果没有被加入对象,下一帧计数-1,当计数为0 就自动被对象池清理,retain()函数就是手动增加一次计数,相对应的release()就是手动释放一次。
/** Director will trigger an event before set next scene. */
static const char* EVENT_BEFORE_SET_NEXT_SCENE;
/** Director will trigger an event after set next scene. */
static const char* EVENT_AFTER_SET_NEXT_SCENE; /** Director will trigger an event when projection type is changed. */
static const char* EVENT_PROJECTION_CHANGED;
/** Director will trigger an event before Schedule::update() is invoked. */
static const char* EVENT_BEFORE_UPDATE;
/** Director will trigger an event after Schedule::update() is invoked. */
static const char* EVENT_AFTER_UPDATE;
/** Director will trigger an event while resetting Director */
static const char* EVENT_RESET;
/** Director will trigger an event after Scene::render() is invoked. */
static const char* EVENT_AFTER_VISIT;
/** Director will trigger an event after a scene is drawn, the data is sent to GPU. */
static const char* EVENT_AFTER_DRAW;
/** Director will trigger an event before a scene is drawn, right after clear. */
static const char* EVENT_BEFORE_DRAW;
这些代码定义了导演类的事件,看名字定义,应该是导演在事件发生的时候的处理,具体再看。
enum class Projection
{
/// Sets a 2D projection (orthogonal projection).
_2D, /// Sets a 3D projection with a fovy=60, znear=0.5f and zfar=1500.
_3D, /// It calls "updateProjection" on the projection delegate.
CUSTOM, /// Default projection is 3D projection.
DEFAULT = _3D,
};
对于模型的的一个枚举变量,看这里的Projection定义,我猜测应该是这个模型发生改变的时候,导演上面定义的事件进行对应的改变。
static Director* getInstance(); /**
* @deprecated Use getInstance() instead.
* @js NA
*/
CC_DEPRECATED_ATTRIBUTE static Director* sharedDirector() { return Director::getInstance(); } /**
* @js ctor
*/
Director(); /**
* @js NA
* @lua NA
*/
~Director();
导演类是一个单实例,sharedDirector现在被getInstance方法代替
bool init(); // attribute /** Gets current running Scene. Director can only run one Scene at a time. */
Scene* getRunningScene() { return _runningScene; } /** Gets the FPS value. */
float getAnimationInterval() { return _animationInterval; }
/** Sets the FPS value. FPS = 1/interval. */
void setAnimationInterval(float interval); /** Whether or not displaying the FPS on the bottom-left corner of the screen. */
bool isDisplayStats() { return _displayStats; }
/** Display the FPS on the bottom-left corner of the screen. */
void setDisplayStats(bool displayStats) { _displayStats = displayStats; } /** Get seconds per frame. */
float getSecondsPerFrame() { return _secondsPerFrame; } /**
* Get the GLView.
* @lua NA
*/
GLView* getOpenGLView() { return _openGLView; }
/**
* Sets the GLView.
* @lua NA
*/
void setOpenGLView(GLView *openGLView); /*
* Gets singleton of TextureCache.
* @js NA
*/
TextureCache* getTextureCache() const; /** Whether or not `_nextDeltaTimeZero` is set to 0. */
bool isNextDeltaTimeZero() { return _nextDeltaTimeZero; }
/**
* Sets the delta time between current frame and next frame is 0.
* This value will be used in Schedule, and will affect all functions that are using frame delta time, such as Actions.
* This value will take effect only one time.
*/
void setNextDeltaTimeZero(bool nextDeltaTimeZero); /** Whether or not the Director is paused. */
bool isPaused() { return _paused; } /** How many frames were called since the director started */
unsigned int getTotalFrames() { return _totalFrames; } /** Gets an OpenGL projection.
* @since v0.8.2
* @lua NA
*/
Projection getProjection() { return _projection; }
/** Sets OpenGL projection. */
void setProjection(Projection projection); /** Sets the glViewport.*/
void setViewport(); /** Whether or not the replaced scene will receive the cleanup message.
* If the new scene is pushed, then the old scene won't receive the "cleanup" message.
* If the new scene replaces the old one, the it will receive the "cleanup" message.
* @since v0.99.0
*/
bool isSendCleanupToScene() { return _sendCleanupToScene; } /** This object will be visited after the main scene is visited.
* This object MUST implement the "visit" function.
* Useful to hook a notification object, like Notifications (http://github.com/manucorporat/CCNotifications)
* @since v0.99.5
*/
Node* getNotificationNode() const { return _notificationNode; }
/**
* Sets the notification node.
* @see Director::getNotificationNode()
*/
void setNotificationNode(Node *node); // window size /** Returns the size of the OpenGL view in points. */
const Size& getWinSize() const; /** Returns the size of the OpenGL view in pixels. */
Size getWinSizeInPixels() const; /**
* Returns visible size of the OpenGL view in points.
* The value is equal to `Director::getWinSize()` if don't invoke `GLView::setDesignResolutionSize()`.
*/
Size getVisibleSize() const; /** Returns visible origin coordinate of the OpenGL view in points. */
Vec2 getVisibleOrigin() const; /**
* Returns safe area rectangle of the OpenGL view in points.
*/
Rect getSafeAreaRect() const; /**
* Converts a screen coordinate to an OpenGL coordinate.
* Useful to convert (multi) touch coordinates to the current layout (portrait or landscape).
*/
Vec2 convertToGL(const Vec2& point); /**
* Converts an OpenGL coordinate to a screen coordinate.
* Useful to convert node points to window points for calls such as glScissor.
*/
Vec2 convertToUI(const Vec2& point); /**
* Gets the distance between camera and near clipping frame.
* It is correct for default camera that near clipping frame is same as the screen.
*/
float getZEye() const;
这里定义了很多获取方法,首先一个init()方法,在cpp文件里面去看,init整个director对象的初始化工作都在这里面,初始化了 ActionManager 动作管理器 并将 _actionManager加到了定时器里,初始化了EventDispatcher EventCustom 等事件,初始化了纹理 和渲染器 Renderer
bool Director::init(void)
{
setDefaultValues(); _scenesStack.reserve(); // FPS
_lastUpdate = std::chrono::steady_clock::now(); _console = new (std::nothrow) Console; // scheduler
_scheduler = new (std::nothrow) Scheduler();
// action manager
_actionManager = new (std::nothrow) ActionManager();
_scheduler->scheduleUpdate(_actionManager, Scheduler::PRIORITY_SYSTEM, false); _eventDispatcher = new (std::nothrow) EventDispatcher(); _beforeSetNextScene = new (std::nothrow) EventCustom(EVENT_BEFORE_SET_NEXT_SCENE);
_beforeSetNextScene->setUserData(this);
_afterSetNextScene = new (std::nothrow) EventCustom(EVENT_AFTER_SET_NEXT_SCENE);
_afterSetNextScene->setUserData(this);
_eventAfterDraw = new (std::nothrow) EventCustom(EVENT_AFTER_DRAW);
_eventAfterDraw->setUserData(this);
_eventBeforeDraw = new (std::nothrow) EventCustom(EVENT_BEFORE_DRAW);
_eventBeforeDraw->setUserData(this);
_eventAfterVisit = new (std::nothrow) EventCustom(EVENT_AFTER_VISIT);
_eventAfterVisit->setUserData(this);
_eventBeforeUpdate = new (std::nothrow) EventCustom(EVENT_BEFORE_UPDATE);
_eventBeforeUpdate->setUserData(this);
_eventAfterUpdate = new (std::nothrow) EventCustom(EVENT_AFTER_UPDATE);
_eventAfterUpdate->setUserData(this);
_eventProjectionChanged = new (std::nothrow) EventCustom(EVENT_PROJECTION_CHANGED);
_eventProjectionChanged->setUserData(this);
_eventResetDirector = new (std::nothrow) EventCustom(EVENT_RESET);
//init TextureCache
initTextureCache();
initMatrixStack(); _renderer = new (std::nothrow) Renderer;
RenderState::initialize(); #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
EngineDataManager::init();
#endif
return true;
}
init做的事情
接下来继续看,都是一些设置,获取,判断是否存在,转换坐标的方法,直到runScene():
void runWithScene(Scene *scene); /**
*暂停正在运行的场景的执行,将其推送到暂停场景的堆栈上。
*将执行新场景。
*尽量避免大量推送场景以减少内存分配。
*只有在有运行场景时才调用它。
*/
void pushScene(Scene *scene); /**
*从堆栈中弹出一个场景。
*此场景将取代正在运行的场景。
*将删除正在运行的场景。 如果堆栈中没有更多场景,则终止执行。
*只有在有运行场景时才调用它
*/
void popScene(); /**
*弹出堆栈中的所有场景,直到队列中的根场景。
*此场景将取代正在运行的场景。
*在内部,它将调用`popToSceneStackLevel(1)`。
*/
void popToRootScene(); /** 弹出堆栈中的所有场景,直到达到“level”。
如果level为0,它将结束导演。
如果level为1,它将弹出所有场景,直到它到达根场景。
如果level <=比当前堆栈级别,它将不会执行任何操作。
*/
void popToSceneStackLevel(int level); /** 用新的替换正在运行的场景。 正在运行的场景已终止。
*只有在有运行场景时才调用它。
* @js NA
*/
void replaceScene(Scene *scene); /** 结束执行,释放运行场景。
* @lua endToLua
*/
void end(); /*
* 暂停正在运行的场景。
*正在运行的场景将被_drawed_但所有预定的计时器将被暂停。
*暂停时,绘制速率为4 FPS以减少CPU消耗。
*/
void pause(); /** 恢复暂停的场景。
*计划的计时器将再次激活。
*“增量时间”将为0(就好像游戏没有暂停一样)。
*/
void resume(); /*
* Restart the director.重启导演。
* @js NA
*/
void restart();
/** Stops the animation. Nothing will be drawn. The main loop won't be triggered anymore.
* If you don't want to pause your animation call [pause] instead.
*停止动画。 什么都不会被画出来。 主循环不再被触发。
*如果您不想暂停动画调用[暂停]。
*/
void stopAnimation(); /** The main loop is triggered again.
* Call this function only if [stopAnimation] was called earlier.
* @warning Don't call this function to start the main loop. To run the main loop call runWithScene.
*主循环再次被触发。
*仅在先前调用[stopAnimation]时调用此函数。
* @warning不要调用此函数来启动主循环。 要运行主循环,请调用runWithScene。
*/
void startAnimation(); /** Draw the scene.
* This method is called every frame. Don't call it manually.
*画出场景。
*每帧调用此方法。 不要手动调用它。
*/
void drawScene();
之后的方法都是设置,获取各个属性,在注释中看的很清楚
/** Removes all cocos2d cached data.
* It will purge the TextureCache, SpriteFrameCache, LabelBMFont cache
* @since v0.99.3
*删除所有cocos2d缓存数据。
*它将清除TextureCache,SpriteFrameCache,LabelBMFont缓存
* @since v0.99.3
*/
void purgeCachedData(); /** Sets the default values based on the Configuration info.根据配置信息设置默认值 */
void setDefaultValues(); // OpenGL Helper /** Sets the OpenGL default values.
* It will enable alpha blending, disable depth test.
*设置OpenGL默认值。
*它将启用alpha混合,禁用深度测试。
* @js NA
*/
void setGLDefaultValues(); /** Enables/disables OpenGL alpha blending. */
void setAlphaBlending(bool on); /** Sets clear values for the color buffers,
* value range of each element is [0.0, 1.0].
*设置颜色缓冲区的清除值,
*每个元素的值范围是[0.0,1.0]。
* @js NA
*/
void setClearColor(const Color4F& clearColor); /** Enables/disables OpenGL depth test. */
void setDepthTest(bool on); void mainLoop();
/** Invoke main loop with delta time. Then `calculateDeltaTime` can just use the delta time directly.
* The delta time paseed may include vsync time. See issue #17806
*使用增量时间调用主循环。 然后`calculateDeltaTime`可以直接使用delta时间。
*增量时间可能包括vsync时间。 请参阅问题#17806
* @since 3.16
*/
void mainLoop(float dt); /** The size in pixels of the surface. It could be different than the screen size.
* High-res devices might have a higher surface size than the screen size.
* Only available when compiled using SDK >= 4.0.
* @since v0.99.4 *他的表面像素大小。 它可能与屏幕尺寸不同。
*高分辨率设备的表面尺寸可能大于屏幕尺寸。
*仅在使用SDK> = 4.0编译时可用。
*/
void setContentScaleFactor(float scaleFactor);
/**
* Gets content scale factor.
* @see Director::setContentScaleFactor()
*获取内容比例因子。
* @see Director :: setContentScaleFactor()
*/
float getContentScaleFactor() const { return _contentScaleFactor; } /** Gets the Scheduler associated with this director.
* @since v2.0
*/
Scheduler* getScheduler() const { return _scheduler; } /** Sets the Scheduler associated with this director.
*设置与此director关联的Scheduler
* @since v2.0
*/
void setScheduler(Scheduler* scheduler); /** Gets the ActionManager associated with this director.
*获取与此director关联的ActionManager。
* @since v2.0
*/
ActionManager* getActionManager() const { return _actionManager; } /** Sets the ActionManager associated with this director.
*设置与此导演关联的ActionManager。
* @since v2.0
*/
void setActionManager(ActionManager* actionManager); /** Gets the EventDispatcher associated with this director.
*获取与此director关联的EventDispatcher。
* @since v3.0
* @js NA
*/
EventDispatcher* getEventDispatcher() const { return _eventDispatcher; } /** Sets the EventDispatcher associated with this director.设置与此director关联的EventDispatcher。
* @since v3.0
* @js NA
*/
void setEventDispatcher(EventDispatcher* dispatcher); /** Returns the Renderer associated with this director.返回与此director关联的Renderer。
* @since v3.0
*/
Renderer* getRenderer() const { return _renderer; } /** Returns the Console associated with this director.
* @since v3.0
* @js NA
*/
Console* getConsole() const { return _console; } /* Gets delta time since last tick to main loop. */
float getDeltaTime() const; /**
* Gets Frame Rate.
* @js NA
*/
float getFrameRate() const { return _frameRate; } /**
* Clones a specified type matrix and put it to the top of specified type of matrix stack.
* @js NA
*/
void pushMatrix(MATRIX_STACK_TYPE type); /**
* Clones a projection matrix and put it to the top of projection matrix stack.
* @param index The index of projection matrix stack.
* @js NA
*/
void pushProjectionMatrix(size_t index); /** Pops the top matrix of the specified type of matrix stack.
* @js NA
*/
void popMatrix(MATRIX_STACK_TYPE type); /** Pops the top matrix of the projection matrix stack.
* @param index The index of projection matrix stack.
* @js NA
*/
void popProjectionMatrix(size_t index); /** Adds an identity matrix to the top of specified type of matrix stack.
* @js NA
*/
void loadIdentityMatrix(MATRIX_STACK_TYPE type); /** Adds an identity matrix to the top of projection matrix stack.
* @param index The index of projection matrix stack.
* @js NA
*/
void loadProjectionIdentityMatrix(size_t index); /**
* Adds a matrix to the top of specified type of matrix stack.
*
* @param type Matrix type.
* @param mat The matrix that to be added.
* @js NA
*/
void loadMatrix(MATRIX_STACK_TYPE type, const Mat4& mat); /**
* Adds a matrix to the top of projection matrix stack.
*
* @param mat The matrix that to be added.
* @param index The index of projection matrix stack.
* @js NA
*/
void loadProjectionMatrix(const Mat4& mat, size_t index); /**
* Multiplies a matrix to the top of specified type of matrix stack.
*
* @param type Matrix type.
* @param mat The matrix that to be multiplied.
* @js NA
*/
void multiplyMatrix(MATRIX_STACK_TYPE type, const Mat4& mat); /**
* Multiplies a matrix to the top of projection matrix stack.
*
* @param mat The matrix that to be multiplied.
* @param index The index of projection matrix stack.
* @js NA
*/
void multiplyProjectionMatrix(const Mat4& mat, size_t index); /**
* Gets the top matrix of specified type of matrix stack.
* @js NA
*/
const Mat4& getMatrix(MATRIX_STACK_TYPE type) const; /**
* Gets the top matrix of projection matrix stack.
* @param index The index of projection matrix stack.
* @js NA
*/
const Mat4& getProjectionMatrix(size_t index) const; /**
* Clear all types of matrix stack, and add identity matrix to these matrix stacks.
* @js NA
*/
void resetMatrixStack(); /**
* Init the projection matrix stack.
* @param stackCount The size of projection matrix stack.
* @js NA
*/
void initProjectionMatrixStack(size_t stackCount); /**
* Get the size of projection matrix stack.
* @js NA
*/
size_t getProjectionMatrixStackSize(); /**
* returns the cocos2d thread id.
Useful to know if certain code is already running on the cocos2d thread
*/
const std::thread::id& getCocos2dThreadId() const { return _cocos2d_thread_id; } /**
* returns whether or not the Director is in a valid state
*/
bool isValid() const { return !_invalid; }
Director主要管理了场景,以场景为单位来控制游戏的逻辑帧,通过场景的切换来实现游戏中不同界面的变化。mainloop这个函数 调用 了drawscene来实现每一帧的逻辑主要是渲染逻辑。application里面有一个run方法 ,在run方法里面有一个死循环,那个是游戏的主循环,在那个死循环里不断的调用 director->mainLoop这个就是在主游戏循环里不断的执行逻辑帧的操作.
cocos2dx 3.17.1 导演类的更多相关文章
- [置顶] 【cocos2d-x入门之五】导演类CCDirector
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12646337 既然cocos2d-x都帮我们封装好了,使得开发与平台无关,那 ...
- 【Cocos2d-X开发学习笔记】第03期:渲染框架之导演类(CCDirector)的使用
本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 提到“导演”一词,想必读者最先联想到的是电影.作为娱乐产 ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)
今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...
- 【转】cocos2dx3.2学习笔记之Director(导演类)
转载:https://blog.csdn.net/u013435551/article/details/38579747 在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),D ...
- CCDirector导演类
CCDirector类是Cocos2D-x游戏引擎的核心.它用来创建而且控制着屏幕的显示,同一时候控制场景的显示时间和显示方式. 在整个游戏里一般仅仅有一个导演.游戏的開始.结束.暂停都会调用CCDi ...
- cocos2dx[3.2](7) 核心类Director/Scene/Layer/Sprite
[核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: cocos2dx基础篇(2) 第一个程序 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. ...
- Lua + win 10 + vs2017的运行环境和创建cocos2dx 3.17的lua项目(亲测)
转:https://blog.csdn.net/maoye198602102339/article/details/82047920 不管用什么引擎写游戏,脚本语言是少不了要接触的! 首先,我说的 ...
- cocos2dx 3.17(Windows下) 接入skynet和sprotol
大致流程一致,但是他的github上的版本,没有Windows的版本.打开他的win的工程会提示缺少一个模块. 本人环境 cocos2dx 3.17.1 当前最新 skynet-无视-当前最新 VS2 ...
- cocos2dx[3.2](8) 数学类Vec2/Size/Rect
数学类Vec2.Size.Rect,是cocos2dx中比较常用的类. 比如设置图片位置,设置图片大小,两图片的碰撞检测等等. 比起2.x版本,在3.x中本质上其实没有太大的变化,主要的变化就是将全局 ...
随机推荐
- Vue小项目二手书商城:(五)参考资料
本项目基于vue2.5.2,如有错误,望指正. 完整程序:https://github.com/M-M-Monica/bukesi Vue.js官方文档:https://cn.vuejs.org/v2 ...
- Vue小项目二手书商城:(二)axios前后端数据交互
实现内容: 写路由接口(express) axios取数据 一.写接口 1.我们要在前端取到后端的数据(之前写的data.json)可以用vue-resourse或者用axios,在vue2之后官方就 ...
- 承接AR摄像头识别外包 AR图像识别 AR识别图像 AR识别应用外包
增强现实简称AR,是一种实时计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并实现互动. 这里千万别和VR虚拟现实混了.简单说就是VR看到的场景都是假的, ...
- 虚拟现实外包—动点飞扬软件专门承接VR/AR场景、游戏、项目外包
VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业.教育.游戏.企业大数据展示等) 有VR/AR.Unity3D项目.游戏外包业务欢迎 联系我们 QQ:372900288 TEL:13 ...
- android studio出现offline情况
1.检查是否打开开发者选项 2.检查手机是否处于传输文件模式
- svn hotcopy backup
================== 备份 1/2 ==================svnbackup.bat@echo off@rem Subversion Server 的安装目录set SV ...
- 【笔记】Rancher2.1容器云平台新特性
2018年10月6日,Rancher2.1版本正式发布.相比Rancher2.0版本,提供了许多新的特性: 1.支持集群和项目级别的硬件资源配额管理:2.支持3个节点的Rancher Server的管 ...
- jupyter notebook——安装配置
本地登陆 cmd输入下面的命令,会进入用户主目录 jupyter notebook 在浏览器打开时,提示输入token,复制命令行上的token还是不能进入,其实浏览器上有提示的,按照提示操作即可,输 ...
- 三年磨一剑,robot framework 自动化测试框架核心指南,真正讲透robot framework自动化测试框架(笔者新书上架)。
序 关于自动化测试的工具和框架其实有很多.自动化测试在测试IT行业中扮演着越来越重要的角色,不管是在传统的IT行业还是高速发展的互联网行业或是如今的大数据和大热的人工智能领域,都离不开测试,也更加离不 ...
- document.documentElement.clientHeight和document.body.clientHeight区别
首先了解下document HTML DOM 节点 在 HTML DOM (Document Object Model) 中 , 每一个元素都是 节点: 文档是一个文档节点. 所有的HTML元素都是元 ...