cocos2d-X 导演类(Director.h)API
来源:互联网 发布:网络存储服务器 编辑:程序博客网 时间:2024/04/30 05:43
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
cocos2d-X 导演类(Director.h)API
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
导演类,创建一个主窗口来管理所有的场景,(通常一个游戏里面只有一个导演)
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__
- cocos2d-X 导演类(Director.h)API
- Cocos2d-x学习笔记《06》—— 导演类Director
- cocos2d-x中的导演类
- Cocos2d-x学习笔记(二)-------->CCDirector导演类
- cocos2d-X 节点(CCNode.h)API
- cocos2d-X 节点(CCLayer.h)API
- cocos2d-X 节点(CCMenu.h)API
- cocos2d-X 节点(CCMenuItem.h)API
- cocos2d-X 节点(CCSprite.h)API
- cocos2d-X 节点(CCTexture2D.h)API
- cocos2d-X 节点(SpriteBatchNode.h.)API
- cocos2d-X 节点(CCSpriteFrame.h..)API
- cocos2d-X 节点(CCAnimationCache.h)API
- cocos2d-X 节点(CCCamera.h.)API
- cocos2d-X 节点(CCAction.h)API
- cocos2d-X 节点(CCActionManager.h)API
- cocos2d-X 节点(CCIMEDelegate.h)API
- cocos2d-X 节点(CCLabelAtlas.h)API
- DIV高度自适应及应该注意的问题
- SQLite之采用ListView实现数据列表显示
- Codeblock输入中文乱码解决方法
- java的Override
- 幸福,请多留一份拥有的温存--天空16度蓝
- cocos2d-X 导演类(Director.h)API
- Android入门笔记之人脸识别初学
- 关于ADT升级到22,出现NoClassDefFoundError 的解决办法
- Document:getElementsByName()用法及范例
- Day07_for多种写法以及while.do用法
- 理解java中的ThreadLocal
- Day08_数组
- ThinkPHP Session跨域设置
- 怎样做才能让Java 序列化机制 更安全 ? Security principles we follow to make Java Serialization safe.