zoukankan      html  css  js  c++  java
  • 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(15);
    
        // 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这个就是在主游戏循环里不断的执行逻辑帧的操作.

  • 相关阅读:
    logging模块-logging.basicConfig、logger.setLevel、handler.setLevel优先级
    Python标准模块--logging(转载)
    第三节,入门知识和windows系统安装python环境
    第二节windows系统下Xshell 5软件远程访问虚拟机 Linux系统
    第一节windows系统安装虚拟机VMware 软件
    数学数列
    java String
    linux eclipse 报错过时的方法
    java.util.Random 类
    java uitl
  • 原文地址:https://www.cnblogs.com/zhangthree/p/10515985.html
Copyright © 2011-2022 走看看