本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
cocos2d-X 导演类(Director.h)API
导演类,创建一个主窗口来管理所有的场景,(通常一个游戏里面只有一个导演)
2.1获取当前正在运行的场景、获取每秒帧数、是否要切换场景、获取视图尺寸、切换/停止 场景、清楚缓存、设置配置信息
2.1获取当前正在运行的场景、获取每秒帧数、是否要切换场景、获取视图尺寸、切换/停止 场景、清楚缓存、设置配置信息
#ifndef __CCDIRECTOR_H__
#define __CCDIRECTOR_H__
#include "platform/CCPlatformMacros.h"
#include "cocoa/CCObject.h"
#include "ccTypes.h"
#include "cocoa/CCGeometry.h"
#include "cocoa/CCArray.h"
#include "CCGL.h"
#include "kazmath/mat4.h"
#include "label_nodes/CCLabelAtlas.h"
NS_CC_BEGIN
/**
* @addtogroup base_nodes
* @{
*/
/* Forward declarations. */ //告诉编译器这些类存在
class LabelAtlas;
class Scene;
class EGLView;
class DirectorDelegate;
class Node;
class Scheduler;
class ActionManager;
class TouchDispatcher;
class KeyboardDispatcher;
class KeypadDispatcher;
class Accelerometer;
简要
/**
@类但简要 创建一个主窗口来管理 scenes(场景)
Director 也负责以下:
- 初始化 OpenGL 上下文
- 设置 OpenGL像素格式 (默认值时 RGB565)
- 设置 OpenGL 缓存大小 (默认是 0-bit)
- 设置 投影 (默认是一个 3D)
- 设置 方向 (默认是 Portrait) //竖屏
自从 Director 是一个 singleton, 标准的调用方法是:
_ Director::getInstance()->methodName();
Director 也设置默认的 OpenGL 上下文:
- GL_TEXTURE_2D 可行的/Users/ai/cocos2d/cocos2d-x-3.0alpha0/cocos2d_libs.xcodeproj
- GL_VERTEX_ARRAY 可行的
- GL_COLOR_ARRAY 可行的
- GL_TEXTURE_COORD_ARRAY 可行的
*/
class CC_DLL Director : public Object
{
public:
导演可能使用的OpenGl投影
/** @typedef ccDirectorProjection的导演可能使用 OpenGL 的 投影
*/
enum class Projection
{
///设定的二维投影(正投影)
_2D,
/// 使用 fovy=60, znear=0.5f and zfar=1500 设置一个3D投影.(Y方向的视角--fovy;视锥的纵横比--aspect,视锥的近平面坐标--near,视锥的远平面坐标--far。关于 OpenGL——透视投影矩阵 参考 http://hi.baidu.com/imfei/item/7410ae2191473251c38d59a8 和 http://dev.gameres.com/Program/Visual/3D/shenruTS.htm)
_3D,
/// 投影委托里面它调用 "updateProjection"
CUSTOM,
/// 默认投影是 3D 投影
DEFAULT = _3D,
};
/** returns 导演的共享实例 */
static Director* getInstance();
/** @弃用的属性建议使用 getInstance() 代替 */
CC_DEPRECATED_ATTRIBUTE static Director* sharedDirector() { return Director::getInstance(); }
/**
* @js ctor //js的构造函数
*/
Director(void);
/**
* @js NA
* @lua NA
*/
virtual ~Director(void);
virtual bool init(void);
属性
/** 获取当前正在运行的场景。Director 在这个时候只能运行一个场景. */
inline Scene* getRunningScene() { return _runningScene; }
/** Get FPS 值 */ //每秒传输帧数
inline double getAnimationInterval() { return _animationInterval; }
/** Set FPS 值. */
virtual void setAnimationInterval(double dValue) = 0;
/** 是否在左下角显示 FPS */
inline bool isDisplayStats() { return _displayStats; }
/** 在左下角显示 FPS */
inline void setDisplayStats(bool displayStats) { _displayStats = displayStats; }
/** 每帧秒 */
inline float getSecondsPerFrame() { return _secondsPerFrame; }
/** 获取渲染后的 EGLView
* @js NA
* @lua NA
*/
inline EGLView* getOpenGLView() { return _openGLView; }
void setOpenGLView(EGLView *pobOpenGLView);
inline bool isNextDeltaTimeZero() { return _nextDeltaTimeZero; }
void setNextDeltaTimeZero(bool nextDeltaTimeZero);
/** Director 是否被暂停 */
inline bool isPaused() { return _paused; }
/** director 开始到现在持续了多少帧 */
inline unsigned int getTotalFrames() { return _totalFrames; }
/** Sets 一个 OpenGL 投影
@since v0.8.2
* @js NA
* @lua NA
*/
inline Projection getProjection() { return _projection; }
void setProjection(Projection projection);
/** Sets glViewport*/
void setViewport();
/** director 开始到现在持续了多少帧 */
/** 场景是否收到替换清楚但消息
如果新的场景已经被 pushed (推出),那么旧的场景将不会收到“执行清理”的消息。
如果新的场景替换了旧的,它会收到“执行清理”消息。
@since v0.99.0
*/
inline bool isSendCleanupToScene() { return _sendCleanupToScene; }
/** 主场景访问后这个对象将被访问
这个对象必须实现 "visit" 选择器.
和通知对象挂钩, 像这个 Notifications (http://github.com/manucorporat/CCNotifications)
@since v0.99.5
*/
Node* getNotificationNode();
void setNotificationNode(Node *node);
/** Director 代理. 他应该实现 DirectorDelegate 协议
@since v0.99.5
* @js NA
* @lua NA
*/
DirectorDelegate* getDelegate() const;
/**
* @js NA
* @lua NA
*/
void setDelegate(DirectorDelegate* delegate);
窗口大小
/** returns 以点为单位的 OpenGL 视图的大小
*/
const Size& getWinSize() const;
/** returns 以像素为单位的 OpenGL 视图的大小
*/
Size getWinSizeInPixels() const;
/** returns 以点为单位的 OpenGL 视图的可见大小.
* 如果不调用 EGLView::setDesignResolutionSize() 值等于 getWinSize
*/
Size getVisibleSize() const;
/** returns 以点为单位的 OpenGL 视图的初始化时的可见大小
*/
Point getVisibleOrigin() const;
/** UIKit的坐标转换到一个OpenGL坐标
* 使用当前布局(横向或纵向)有效的(多)触摸坐标
*/
Point convertToGL(const Point& point);
/** 一个OpenGL坐标转换到UIKit的坐标
点组成的窗口调用有效的节点上面的点,例如 glScissor
*/
Point convertToUI(const Point& point);
/// XXX: missing description
float getZEye() const;
场景管理
/** 根据给定但场景进入 Director's 但主循环
* 只能调用他运行你的第一个场景.
* 如果已经有一个场景在运行了就不要在调用他来
*
* 它将调用pushScene:然后它会调用startAnimation
*/
void runWithScene(Scene *scene);
/** 停止执行正在运行的场景中,pushing 一个在堆栈上推暂停的场景。
* 新的场景将被执行.
* 尽量避免在堆栈上存放一个很大的场景以减少内存非陪,
* 仅在有一个正在运行但场景但时候调用他.
*/
void pushScene(Scene *scene);
/** 从队列中弹出一个场景。
* 这个场景将替换正在运行的场景.
* 正在运行的场景将被删除。如果有堆栈中没有其它的场景那么 popScene 的执行会被终止。
* 仅在有一个正在运行但场景但时候调用他.
*/
void popScene();
/** 从队列中弹出所有的场景,直到只有根场景在队列中
* 这个场景将替换正在运行的场景.
* 在内部塌毁调用 `popToSceneStackLevel(1)`
*/
void popToRootScene();
/** 弹出从队列中的所有场景,直到它到达 `level`.
如果 level 是 0,它将结束 director.
如果 level 是 1, 从队列中弹出所有的场景,直到只有根场景在队列中
如果 level <= 当前的堆栈水平,它不会做任何事情。
*/
void popToSceneStackLevel(int level);
/** 用一个新的替换正在运行的场景。终止正在运行的场景。
* 仅在有一个正在运行但场景但时候调用他.
*/
void replaceScene(Scene *scene);
/** 结束执行,释放正在运行的场景。
它不会从其父视图中删除的OpenGL视图。你有做手工。
* @lua endToLua
*/
void end();
/** 暂停正在运行的场景。.
正在运行的场景将被绘制,但所有预定的定时器将被暂停
暂停时,绘制周期将只有4个FPS,以降低CPU消耗
*/
void pause();
/** 恢复暂停的场景
预定的定时器将被再次激活。
“推迟执行”的时间将是0(如果游戏没有暂停)
*/
void resume();
/** 停止动画,什么也不画. 主循环线程再也不会被触发.
如果你不希望那样,那么就用暂停你的游戏代替
*/
virtual void stopAnimation() = 0;
/** 主循环线程重新被触发发.
这个函数只在你已经调用 [stopAnimation] 函数的时候调用
@warning 不要使用这个函数启动主线程循环. 请使用 主线程调用 runWithScene
*/
virtual void startAnimation() = 0;
/** 绘制场景.
这个方法每一帧都会调用,不要手动调用这个方法.
*/
void drawScene();
内存助手
/** 移除所有 cocos2d 缓存数据.
他将清楚 TextureCache, SpriteFrameCache, LabelBMFont 缓存
@since v0.99.3
*/
void purgeCachedData();
/** 设置配置信息的默认值 */
void setDefaultValues();
// OpenGL Helper
/** 设置 OpenGL 默认值 */
void setGLDefaultValues();
/** 启用/禁用 OpenGL alpha 混合 */
void setAlphaBlending(bool on);
/** 启用/禁用 OpenGL 深度测试 */
void setDepthTest(bool on);
virtual void mainLoop() = 0;
/** 基于像素但 surface 尺寸. 它可以和屏幕尺寸不同 //表面
High-res 设备或许有一个高于屏幕尺寸但 surface 尺寸
只在编译 SDK >= 4.0 时有效.
@since v0.99.4
*/
void setContentScaleFactor(float scaleFactor);
float getContentScaleFactor() const;
public:
/** Gets 和这个 director 关联的预定的定时器
@since v2.0
*/
Scheduler* getScheduler() const;
/** Sets 和这个 director 关联的预定的定时器
@since v2.0
*/
void setScheduler(Scheduler* scheduler);
/** Gets 和这个 director 关联但 ActionManager
@since v2.0
*/
ActionManager* getActionManager() const;
/** Sets 和这个 director 关联但 ActionManager
@since v2.0
*/
void setActionManager(ActionManager* actionManager);
/* Gets 获取主循环线程之间的延迟时间 */
float getDeltaTime() const;
protected:
void purgeDirector();
bool _purgeDirecotorInNextLoop; // 在 end() 这个参数将会被设置成 true
void setNextScene();
void showStats();
void createStatsLabel();
void calculateMPF();
void getFPSImageData(unsigned char** datapointer, unsigned int* length);
/** 计算上次和这次主循环线程之间的延迟时间 */
void calculateDeltaTime();
protected:
/** 和 director 关联的定时器
@since v2.0 调度
*/
Scheduler* _scheduler;
/** 和 ActionManager 关联的定时器
@since v2.0 动作管理
*/
ActionManager* _actionManager;
/* 自从上次触发主循环线程的延迟时间 */
float _deltaTime;
/* 所有但 EGLView 渲染在那里 */
EGLView *_openGLView;
double _animationInterval;
double _oldAnimationInterval;
/* 是否横向 ? */
bool _landscape;
bool _displayStats;
float _accumDt;
float _frameRate;
LabelAtlas *_FPSLabel;
LabelAtlas *_SPFLabel;
LabelAtlas *_drawsLabel;
/** Director 是否暂停了 */
bool _paused;
/* director 启动后到现在经过了多少帧 */
unsigned int _totalFrames;
unsigned int _frames;
float _secondsPerFrame;
/* 正在运行的场景 */
Scene *_runningScene;
/* 下一帧将要运行的场景,下一帧将要运行的场景是弱引用 */
Scene *_nextScene;
/* true, 那么 "old" 旧的场景会收到清楚信息 */
bool _sendCleanupToScene;
/* 定时器里面的场景数组 */
Array* _scenesStack;
/* 主循环线程上次更新但时间 */
struct timeval *_lastUpdate;
/* 是否将下次但延迟时间设置为0 */
bool _nextDeltaTimeZero;
/* 使用的投影 */
Projection _projection;
/* 点组成的窗口尺寸 */
Size _winSizeInPoints;
/* 内容比例因子 */
float _contentScaleFactor;
/* 储存 fps 字符串 */
char *_FPS;
/* 主场景访问后这个对象将被访问,和通知对象挂钩, */
Node *_notificationNode;
/* Projection 代理协议 */
DirectorDelegate *_projectionDelegate;
// EGLViewProtocol 将重新创建 labels 的属性,以适应可见部分的举行
friend class EGLViewProtocol;
};
简要 DisplayLinkDirector
/**
@brief DisplayLinkDirector 是一个 synchronizes 屏幕刷新速率的定时器 //简要
特点和局限性:
- 预定的定时器 & 绘制 synchronizes 屏幕刷新速率
- 只支持动画间隔时 1/60 1/30 & 1/15 的情况
@since v0.8.2
*/
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;
};
// end of base_node group
/// @}
NS_CC_END
#endif // __CCDIRECTOR_H__