cocos2d-X 导演类(Director.h)API

来源:互联网 发布:网络存储服务器 编辑:程序博客网 时间:2024/04/30 05:43

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-X 导演类(Director.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
导演类,创建一个主窗口来管理所有的场景,(通常一个游戏里面只有一个导演)
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__


原创粉丝点击