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

本文来自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__


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值