cocos API



--node
一個節點的主要特點:
    > 他們可以包含其他的節點對象(addChild, getChildByTag, removeChild, etc)
    > 他們可以安排定期的回調(schedule, unschedule, etc)
    > 他們可以執行一些動作(runAction, stopAction, etc)
    > 子類節點通常意味着(單一的/所有的):
        > 重寫初始化資源並且可以安排回調
        > 創建回調來操作進行的時間
        > 重寫“draw”來渲染節點
    > 節點的屬性有:位置、縮放、旋轉、傾斜、錨點、內容大小、可見性

    下面將介紹一下節點主要常用的一些操作函數,以及新的功能特性。
    (1)節點的屬性
    (2)節點的操作
    (3)動作相關Action
    (4)定時器相關schedule
    (5)整合NodeRBGA類
    (6)查找子節點enumerateChildren
    (7)渲染順序zOrder
    (8)座標轉換


 1、節點的屬性
 節點的屬性有:位置、縮放、旋轉、傾斜、錨點、內容大小、可見性。
  位置Position
 *     設置節點的座標(x,y).在OpenGL中的座標
 *     增加3D座標
 *     增加標準化座標設置
 */
    virtual void setPosition(const Vec2 &position); //Vec2座標
    virtual void setPosition(float x, float y);     //(x,y),比Vec2更有效率
    virtual void setPositionX(float x);
    virtual void setPositionY(float y);
    virtual const Vec2& getPosition() const;
    virtual void  getPosition(float* x, float* y) const;
    virtual float getPositionX(void) const;
    virtual float getPositionY(void) const;

//增加3D座標
    virtual void setPosition3D(const Vec3& position); //Vec3座標
    virtual Vec3 getPosition3D() const;
    virtual void setPositionZ(float positionZ);
    virtual float getPositionZ() const;

//增加標準化座標設置
    //Node的位置像素會根據它的父節點的尺寸大小計算
    //Size s = getParent()->getContentSize();
    //_position = pos * s;
    virtual void setNormalizedPosition(const Vec2 &position);
    virtual const Vec2& getNormalizedPosition() const;


/**
 * 放縮Scale
 *     設置節點的放縮比例. 對XYZ軸進行放縮
 *     例如一張圖片. 放縮它的寬X,高Y,深Z
 */
    virtual void setScaleX(float scaleX);              //放縮寬X
    virtual void setScaleY(float scaleY);              //放縮高Y
    virtual void setScaleZ(float scaleZ);              //放縮深Z
    virtual void setScale(float scaleX, float scaleY); //X放縮fScaleX倍,Y放縮fScaleY倍
    virtual void setScale(float scale);                //XYZ同時放縮scale倍
    virtual float getScaleX() const;
    virtual float getScaleY() const;
    virtual float getScaleZ() const;
    virtual float getScale()  const;                   //當x,y放縮因子相同時,得到該節點的縮放因子


/**
 * 旋轉Rotation
 *     設置節點的旋轉角度. 負順,正逆時針旋轉
 *     增加3D旋轉
 */
    virtual void setRotation(float rotation);
    virtual float getRotation() const;

//增加3D旋轉
    virtual void setRotation3D(const Vec3& rotation); 
    virtual Vec3 getRotation3D() const;


/**
 * 傾斜Skew
 *     設置XY軸的傾斜角度
 *     setRotationalSkew()  模擬Flash的傾斜功能
 *     setSkew()            使用真正的傾斜功能
 */
    virtual void setSkewX(float skewX); //水平旋轉傾斜.負順時針變形
    virtual void setSkewY(float skewY); //垂直旋轉傾斜
    virtual void setRotationSkewX(float rotationX);
    virtual void setRotationSkewY(float rotationY);
    virtual float getSkewX() const;
    virtual float getSkewY() const;
    virtual float getRotationSkewX() const;
    virtual float getRotationSkewY() const;


/**
 * 錨點AnchorPoint
 *     錨點就像一枚圖釘,將圖片釘在屏幕上.而錨點就是圖片的座標.
 *     當然圖釘可以釘在圖片的左下角,右上角,或者中心都可以.
 *     (0,0)表示左下角,(1,1)表示右上角
 *     默認的錨點是(0.5,0.5),即節點的正中心
 */
    virtual void setAnchorPoint(const Vec2& anchorPoint); //標準化的錨點
    virtual const Vec2& getAnchorPoint() const;           //標準化的錨點
    virtual const Vec2& getAnchorPointInPoints() const;   //返回絕對像素的錨點,即屏幕座標

//是否忽略錨點的設置
    //若忽略錨點設置,錨點永遠爲(0,0)
    //默認值是false, 但是在Layer和Scene中是true
    //這是一個內部方法,僅僅被Layer和Scene使用,不要自行調用!
    virtual void ignoreAnchorPointForPosition(bool ignore);
    virtual bool isIgnoreAnchorPointForPosition() const;


/**
 * 內容大小ContentSize
 *     contentSize依然是相同的,無論節點是縮放或者旋轉 
 *     所有的節點都有大小,圖層和場景有相同的屏幕大小
 */
    virtual void setContentSize(const Size& contentSize);
    virtual const Size& getContentSize() const;

/**
 * 可見性Visible
 */
    virtual void setVisible(bool visible);
    virtual bool isVisible() const;


2、節點的操作
    節點的操作有:標記、名字、自定義數據、父節點管理、子節點管理、其他操作管理。

//
/**
 * 標記與名字 Tag and Name
 *     setTag  : 給節點設置一個編號
 *     setName : 給節點設置一個名字
 */
    virtual void setTag(int tag);
    virtual void setName(const std::string& name);
    virtual int getTag() const;
    virtual std::string getName() const;


/**
 * 自定義數據UserData/Object
 *     setUserData   : 設置一個用戶自定義的數據. 可以爲一個數據塊, 結構體或者一個對象.
 *     setUserObject : 設置一個用戶自定義的對象. 和userData類似, 但它是一個對象而不是void*
 */
    virtual void setUserData(void *userData);
    virtual void setUserObject(Ref *userObject);
    virtual void* getUserData();
    virtual Ref* getUserObject();


/**
 * 設置父節點Parent
 *     setParent , removeFromParent
 */
    virtual void setParent(Node* parent);
    virtual Node* getParent();
    virtual void removeFromParent();
    virtual void removeFromParentAndCleanup(bool cleanup); //true則刪除該節點的所有動作及回調函數.


/**
 * 管理子節點Child
 *     addChild , 
 *     getChildBy** , getChildren       , getChildrenCount
 *     removeChild  , removeAllChildren
 *     reorderChild , sortAllChildren
 */
    //添加子節點
    //localZOrder   Z軸順序爲了繪畫的優先權
    //tag           節點編號,可通過tag獲取子節點
    //name        節點名字,可通過name獲取子節點
    virtual void addChild(Node * child);
    virtual void addChild(Node * child, int localZOrder);
    virtual void addChild(Node* child, int localZOrder, int tag);
    virtual void addChild(Node* child, int localZOrder, const std::string &name);

    //獲取子節點
    virtual Node* getChildByTag(int tag) const;
    virtual Node* getChildByName(const std::string& name) const;
    virtual Vector<Node*>& getChildren();     //獲得所有子節點,並以Vector數組返回
    virtual ssize_t getChildrenCount() const; //子節點總數

    //刪除子節點
    virtual void removeChild(Node* child, bool cleanup = true);
    virtual void removeChildByTag(int tag, bool cleanup = true);
    virtual void removeChildByName(const std::string &name, bool cleanup = true);
    virtual void removeAllChildren();                        //刪除所有節點
    virtual void removeAllChildrenWithCleanup(bool cleanup); //cleanup爲true則刪除子節點的所有動作

    //重排子節點
    //重新排序一個子節點,設定一個新的z軸的值
    //child         它必須是已經添加的
    //localZOrder   Z軸順序爲了繪畫優先級
    virtual void reorderChild(Node * child, int localZOrder);
    virtual void sortAllChildren(); //重新排序所有子節點


/**
 * 其他操作管理
 */
    virtual void onEnter();                    //節點開始進入舞臺時調用.即創建時調用.
    virtual void onEnterTransitionDidFinish(); //節點進入舞臺後調用.即創建完後調用.
    virtual void onExit();                     //節點離開舞臺時調用.即移除時調用
    virtual void onExitTransitionDidStart();   //節點離開舞臺前調用.

    virtual void visit() final;

    //返回包含Node(節點)的Scene(場景). 
    //若不屬於任何的場景,它將返回nullptr
    virtual Scene* getScene() const;

    //返回節點在父節點座標中的矩形邊界框
    virtual Rect getBoundingBox() const;

    //暫停所有的活動着的動作和調度器
    virtual void cleanup();
//
//
//
3、動作相關Action
    動作管理:運行、暫停、取消等操作。
    //
/**
 * 動作管理Action
 *     setActionManager
 *     runAction , stopAction , getActionByTag , getNumberOfRunningActions
 */
    //設置被所有動作使用的ActionManager對象
    //如果你設置了一個新的ActionManager, 那麼之前創建的動作將會被刪除
    virtual void setActionManager(ActionManager* actionManager);
    virtual ActionManager* getActionManager();

    Action* runAction(Action* action);          //執行一個動作
    Action* getActionByTag(int tag);            //獲取動作, 根據tag標記
    void stopAllActions();                      //暫停動作
    void stopAction(Action* action);            //暫停動作
    void stopActionByTag(int tag);              //暫停動作
    ssize_t getNumberOfRunningActions() const;  //獲取正在運行的動作數量


4、定時器相關schedule
    定時器管理,默認定時器、自定義定時器、一次性定時器。
    //
/**
 * 定時器管理schedule
 *     setScheduler
 *     scheduleUpdate : 默認定時器
 *     schedule       : 自定義定時器
 *     scheduleOnce   : 一次性定時器
 */
    //設置一個調度器對象,來調度所有的“update”和定時器
    //如果你設置了一個新的調度器,那麼之前創建的timers/update將會被刪除。
    virtual void setScheduler(Scheduler* scheduler);
    virtual Scheduler* getScheduler(); //得到調度器對象

    //開啓默認定時器.刷新次數爲60次/秒.即每秒60幀.
    //與update(float delta)回調函數相對應.
    //給予定時器優先級priority.其中priority越小,優先級越高
    void scheduleUpdate(void);
    void scheduleUpdateWithPriority(int priority);
    void unscheduleUpdate(void);      //取消默認定時器
    virtual void update(float delta); //update爲scheduleUpdate定時器的回調函數.

    //設置自定義定時器.默認爲每秒60幀.
    //interval  :   每隔interval秒,執行一次.
    //repeat    :   重複次數.
    //delay     :   延遲時間,即創建定時器delay後開始執行.
    void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
    void schedule(SEL_SCHEDULE selector, float interval);
    void schedule(SEL_SCHEDULE selector);                  //默認爲每秒60幀
    void scheduleOnce(SEL_SCHEDULE selector, float delay); //只執行一次,delay秒後執行

    void unschedule(SEL_SCHEDULE selector);                //取消一個自定義定時器
    void unscheduleAllSelectors(void);                     //取消所有定時器
    void resume(void);                                     //恢復所有定時器和動作
    void pause(void);                                      //暫停所有定時器和動作
//
//
5、整合NodeRGBA類
    整合NodeRGBA類,增加顏色、透明度的設置。
    //
/**
 * 整合NodeRGBA類
 *     setOpacity : 透明度
 *     setColor   : 顏色
 */
    virtual GLubyte getOpacity() const;
    virtual GLubyte getDisplayedOpacity() const;
    virtual void setOpacity(GLubyte opacity);

    virtual const Color3B& getColor() const;
    virtual const Color3B& getDisplayedColor() const;
    virtual void setColor(const Color3B& color);
//
//
6、enumerateChildren
    新增的Node::enumerateChildren方法,且支持C++ 11的正則表達式。
    用於枚舉某個Node節點的子節點,並讓名字符合"name通配符"的子節點執行callback函數。
    且callback函數返回類型應該爲一個bool值,並且返回爲true時,結束查找。

    virtual void enumerateChildren(const std::string &name, std::function<bool(Node* node)> callback) const;

    使用舉例:
    //Find nodes whose name is 'nameToFind' and end with digits. 
    node->enumerateChildren("nameToFind[[:digit:]]+", 
        [](Node* node) -> bool { ... return false; // return true to stop at first match });
    //Find nodes whose name is 'nameToFind' and end with digits recursively. 
    node->enumerateChildren("nameToFind[[:digit:]]+", 
        [](Node* node) -> bool { ... return false; // return true to stop at first match });

    通配符匹配舉例:
        //搜索語法選項
        '//' : 遞歸訪問所有子節點,   只能放在搜索串的開頭位置
        '..' : 搜索移至node的父節點, 只能放在某個字符串的結束位置
        '/'  : 搜索移至node的子節點, 可以放在任何位置,除了搜索串的開頭位置

        //代碼舉例
        enumerateChildren("//MyName", ...)     : 遞歸訪問Node的所有子節點。查找匹配 "MyName" 的子節點
        enumerateChildren("[[:alnum:]]+", ...) : 在Node的兒子節點中查找。  所有項
        enumerateChildren("A[[:digit:]]", ...) : 在Node的兒子節點中查找。  名字爲 "A0","A1",...,"A9" 的子節點
        enumerateChildren("Abby/Normal", ...)  : 在Node的孫子節點中查找。  其節點爲"Normal",且父節點爲"Abby"
        enumerateChildren("//Abby/Normal", ...): 遞歸訪問Node的所有子節點。其節點爲"Normal",且父節點爲"Abby"

7、渲染順序
    在2.x中是使用Zorder來控制節點渲染的先後順序的。而在3.x中渲染的順序則是由兩個因素決定。
        > 全局Z順序:GlobalZOrder。所有節點之間對比。
        > 局部Z順序:LocalZOrder。 兄弟節點之間對比。
    且Z順序越小,最先渲染。

    7.1、全局Z順序
        > 定義渲染節點的順序,擁有全局Z順序越小的節點,最先渲染。
        > 假設:兩個或者更多的節點擁有相同的全局Z順序,那麼渲染順序無法保證。唯一的例外是如果節點的全局Z順序爲零,那麼場景圖順序是可以使用的。
        > 默認的,所有的節點全局Z順序都是零。這就是說,默認使用場景圖順序來渲染節點。
        > 全局Z順序是非常有用的當你需要渲染節點按照不同的順序而不是場景圖順序。
        > 侷限性: 全局Z順序不能夠被擁有繼承“SpriteBatchNode”的節點使用。
        virtual void setGlobalZOrder(float globalZOrder);
        virtual float getGlobalZOrder() const;

    7.2、局部Z順序
    > LocalZOrder是“key”(關鍵)來分辨節點和它兄弟節點的相關性。
    > 父節點將會通過LocalZOrder的值來分辨所有的子節點。如果兩個節點有同樣的LocalZOrder,那麼先加入子節點數組的節點將會比後加入的節點先得到渲染,
      那麼先加入的節點會被後加入的節點遮蓋[update 20140927]。
    > 同樣的,場景圖使用“In-Order(按順序)”遍歷數算法來遍歷。並且擁有小於0的LocalZOrder的值的節點是“left”子樹(左子樹) 
      所以擁有大於0的LocalZOrder的值得節點是“right”子樹(右子樹)。
       //設置這個節點的局部Z順序((相對於兄弟節點))
      virtual void setLocalZOrder(int localZOrder);
      virtual int getLocalZOrder() const;



8、座標轉換

座標分爲兩種座標:
        > 世界座標:就是相對節點的世界座標。
        > 局部座標:就是相對節點的座標。

    8.1
    /**
     * 座標轉換convertTo
     *     WorldSpace :   世界座標
     *     NodeSpace  :  局部座標
     *
     */
        //把世界座標, 轉換到當前節點的本地座標系中
        //基於Anchor Point, 把基於當前節點的本地座標系下的座標, 轉換到世界座標系中
        Vec2 convertToNodeSpace(const Vec2& worldPoint) const;
        Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const;


        //把基於當前節點的本地座標系下的座標, 轉換到世界座標系中
        //基於Anchor Point. 把世界座標, 轉換到當前節點的本地座標系中
        Vec2 convertToWorldSpace(const Vec2& nodePoint) const;
        Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const;


        //把觸點座標, 轉換到當前節點的本地座標系中
        Vec2 convertTouchToNodeSpace(Touch * touch) const;
        Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;
    8.2
        > node1座標爲:(20,40), 錨點(0,0)。
        > node2座標爲:(-5,-20),錨點(1,1)。
        > Vec2 point1 = node1->convertToNodeSpace(node2->getPosition());
            結果爲:(-25,-60)。(即:相對node1節點座標位置,的,相對座標)
            分析  :node2相對node1節點的座標爲:(-5,-20) - (20,40) 。
                    也就是說:node2相對node1的座標位置。
        > Vec2 point2 = node1->convertToWorldSpace(node2->getPosition());
            結果爲:(15,20)。(即:相對node1的世界座標系統下,的,世界座標)
            分析  :將node1作爲參照,轉換到世界座標爲:(20,40) + (-5,-20) 。
                    也就是說:node2的座標現在被看做是相對node1的座標位置,然後轉換到世界座標。
    8.3
        判斷觸摸點是否觸摸到某個精靈圖片sp的內部區域
        bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
        {
            //將觸點座標, 轉換爲相對節點sp的, 相對座標
            Vec2 point = sp->convertTouchToNodeSpace(touch);

            //構造sp的尺寸矩形
            Size size = sp->getContentSize();
            Rect rect = Rect(0, 0, size.width, size.height);

            //判斷觸點是否觸摸到sp內部
            if (rect.containsPoint(point)) {
                CCLog("點中");
                return true;
            }    
            return false;
        }


--------------------------------Director

    導演Director
    就和現實中的導演一樣,這裏的導演也是起到指導的作用的。導演在這裏負責的就是讓不同的場景切換,控制整個遊戲的流程,包括開始,繼續,暫停等。以及設置、獲取系統信息,比如調整OpenGL相關的設置,獲取屏幕的大小等。
    和Scene、Layer、Sprite等不同的是,導演類Director是直接繼承Ref類的,而不是Node類。

        //
    /** 
        導演類Director主要是用來:
            - 創建一個主窗口
            - 管理場景Scene
        Director 也負責以下: 
            - 初始化 OpenGL 內容
            - 設置 OpenGL 像素格式 (默認值時 RGB565) 
            - 設置 OpenGL 緩存大小 (默認是 0-bit) 
            - 設置 投影 (默認是一個 3D) 
            - 設置 方向 (默認是豎屏Portrait)

        Director 是一個單例對象, 標準的調用方法是:
            - Director::getInstance()->methodName(); 
    */

    class CC_DLL Director : public Ref
    {
    /**
     * 獲取單例對象
     */
        //獲取全局唯一的Director實例 , 替代 sharedDirector
        //使用方法:Director::getInstance()->replaceScene(scene);
        static Director* getInstance();


    /**
     * 場景管理相關
     *     - runWithScene
     *     - pushScene
     *     - popScene , popToRootScene , popToSceneStackLevel
     *     - replaceScene
     *     - pause , resume , end
     *     - getRunningScene , isPaused
     */
        //指定進入Director的主循環運行的場景.
        //ps:僅在運行第一個場景時調用,如果已經存在運行中的場景,不能調用本方法.
        //本方法調用後將調用pushScene方法,然後調用startAnimation.
        void runWithScene(Scene *scene);

        //將運行中的場景暫停,並push到場景堆棧中,運行新的場景.
        void pushScene(Scene *scene);

        //從場景堆棧中pop出一個場景,替換現在正運行的場景,而運行中的場景將被刪除.
        void popScene();

        //從場景堆棧中pop出所有場景,最後一個棧底的場景將替換現在正運行的場景,而運行中的場景將被刪除.
        void popToRootScene();

        //彈出從隊列中的所有場景,直到它到達 level.
        //如果 level 是 0,它將結束 director. 
        //如果 level 是 1, 從隊列中彈出所有的場景,直到只有根場景在隊列中. 
        //如果 level <= 當前的堆棧水平,它不會做任何事情。
       void popToSceneStackLevel(int level);

        //使用新場景替換當前場景,而運行中的場景將被刪除.
        //PS:舊場景不壓入堆棧,而是直接刪除.
        void replaceScene(Scene *scene);

        void pause(void);                //暫停場景
        void resume(void);               //恢復被暫停的場景
        void end(void);                  //終止執行,釋放運行中的場景. GL view需手動移除.

        inline Scene* getRunningScene(); //獲取當前運行的場景
        inline bool isPaused();          //Director 是否被暫停


    /**
     * 刷新幀數FPS相關
     *     - setAnimationInterval
     *     - setDisplayStats
     *     - getSecondsPerFrame , getTotalFrames
     */
        //設置程序的FPS值. 即刷新頻率,相連兩幀的時間間隔.
        //如dValue = 1.0/60.0 表示每秒60幀.
        virtual void setAnimationInterval(double interval) = 0;
        inline double getAnimationInterval();

        //是否在左下角顯示 FPS
        inline void setDisplayStats(bool displayStats);
        inline bool isDisplayStats();

        //獲取每秒執行幀數
        inline float getSecondsPerFrame()

        //從 Director 開機後,總共已經渲染了多少幀
        inline unsigned int getTotalFrames();


    /**
     * OpenGL圖形渲染相關
     *     - setOpenGLView
     *     - setProjection
     *     - getTextureCache
     *     - setViewport , setGLDefaultValues , setAlphaBlending , setDepthTest
     */
        //獲取渲染所有東西的GLView
        void setOpenGLView(GLView *openGLView);
        inline GLView* getOpenGLView();

        //設置一個 OpenGL 投影
        //  Projection::_2D           : 設定的二維投影(正投影)
        //  Projection::_3D           : 使用 fovy=60, znear=0.5f and zfar=1500 設置一個3D投影
        //  Projection::CUSTOM        : 投影委託裏面它調用 "updateProjection".
        //  Projection::DEFAULT = _3D : 默認投影是 3D 投影
        void setProjection(Projection projection);
        inline Projection getProjection();

        TextureCache* getTextureCache() const; //獲取紋理緩衝
        void setViewport();                    //設置glViewport
        void setGLDefaultValues();             //設置 OpenGL 默認值
        void setAlphaBlending(bool on);        //啓用/禁用 OpenGL alpha 混合
        void setDepthTest(bool on);            //啓用/禁用 OpenGL 深度測試


    /**
     * OpenGL View視圖相關
     *     - getWinSize
     *     - getVisibleSize , getVisibleOrigin
     *     - convertToGL , convertToUI
     */
        //類似手機屏幕的大小
        const Size& getWinSize() const;      //獲取OpenGL view大小,單位點.
        Size getWinSizeInPixels() const;     //獲取OpenGL view大小,單位像素.

        //類似程序的遊戲區域
        //如果不調用GLView::setDesignResolutionSize(), 值等於getWinSize
        Size getVisibleSize() const;         //獲取OpenGL View可視區域大小,單位點.
        Vec2 getVisibleOrigin() const;       //獲取可視區域的原點座標.

        //將UIKit座標與OpenGL座標的相互轉換
        //UIKit座標 :原點在屏幕的左上角. 從左到右,從上到下.
        //OpenGL座標:原點在屏幕的左下角. 從左到右,從下到上.
        Vec2 convertToGL(const Vec2& point); //轉爲GL座標
        Vec2 convertToUI(const Vec2& point); //轉爲UI座標


    /**
     * 其他操作
     *     - purgeCachedData
     *     - getRenderer
     *     - setDefaultValues
     *     - setScheduler , setActionManager , setEventDispatcher
     */
        void purgeCachedData();                               //移除所有 cocos2d 緩存數據.
        Renderer* getRenderer() const;                        //獲取渲染器(Renderer). v3.0
        void setDefaultValues();                              //設置配置信息的默認值

        void setScheduler(Scheduler* scheduler);              //設置與director關聯的調度器
        void setActionManager(ActionManager* actionManager);  //設置與director關聯的ActionManager
        void setEventDispatcher(EventDispatcher* dispatcher); //設置與director關聯的EventDispatcher. v3.0
        Scheduler* getScheduler() const;
        ActionManager* getActionManager() const;
        EventDispatcher* getEventDispatcher() const;
    }
    //
    //



精靈Sprite
    精靈說簡單一點,其實就是一個2D的圖片。並賦予圖片各種屬性以及特性。如大小、顏色、放縮、旋轉、動作等。精靈一般都是放在佈景層(Layer)上面的,
    即一個佈景層(Layer)應當有許多的精靈存在。精靈可以用來當做背景、人物、鳥、白雲等內容。
    Sprite不僅繼承了Node,還繼承了紋理協議接口TextureProtocol。
    TextureProtocol紋理協議接口主要是負責紋理圖片的管理。
    注意:精靈的錨點默認爲(0.5,0.5),即中心點。

    //
/**
    Sprite定義爲二維圖像, 可以通過一個圖像或一個圖像的矩形裁剪部分創建Sprite.

        - 爲了優化Sprite渲染,請遵循以下最佳用法:
            - 所有Sprite放入同一個SpriteSheet
            - 所有Sprite使用相同的渲染混合函數(BlendFunc)
            - 使得渲染器(Renderer)自動批量處理("batch")Sprite (將會在一次OpenGL調用內繪製完成)

        - 爲了獲得額外5%~10的渲染優化效果,你可以把Sprite作爲子節點加入到SpriteBatchNode中, 
        - 但這麼做有以下限制:
            - Alias/Antialias屬性屬於SpriteBatchNode,不能單獨設置Sprite的Alias屬性。
            - 渲染混合函數(BlendFunc)屬於SpriteBatchNode,不能單獨設置Sprite的渲染混合函數(BlendFunc)。
            - 不支持ParallaxNode,不過可以使用代理("proxy")Sprite模擬實現。

        - Sprite的子節點只能是其它Sprite(或Sprite的子類)
        - Sprite的默認錨點(anchorPoint)爲(0.5, 0.5)。
 */

    class CC_DLL Sprite : public Node, public TextureProtocol
    {
    /**
     * 創建方法
     *     - create
     *     - createWithTexture
     *     - createWithSpriteFrame
     */
        static Sprite* create();                                                                    //默認創建空精靈對象
        static Sprite* create(const std::string& filename);                                         //圖片文件(*.png)
        static Sprite* create(const std::string& filename, const Rect& rect);                       //截取圖片文件中某一區域圖片
        static Sprite* createWithTexture(Texture2D *texture);                                       //紋理圖片
        static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false); //截取紋理圖片中某一區域圖片,是否旋轉
        static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);                             //精靈幀. 精靈幀一般從plist中讀取的
        static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);               //精靈幀的名字



    /**
     * 批處理節點BatchNode
     *     - updateTransform
     *     - setBatchNode
     *     - getBatchNode
     */
        virtual void updateTransform(void);                          //更新四個值:position(x,y), rotation, scale
        virtual void setBatchNode(SpriteBatchNode *spriteBatchNode); //設置批節點,不推薦手工調用
        virtual SpriteBatchNode* getBatchNode(void);                 //如果精靈是由批節點渲染,則返回批節點


    /**
     * 紋理Texture
     *     - setTexture
     *     - setTextureRect
     */
        //設置精靈的紋理圖片.
        virtual void setTexture(const std::string &filename ); //調用setTextureRect設置Sprite尺寸
        virtual void setTexture(Texture2D *texture) override;  //紋理的矩形尺寸大小不會改變
        virtual Texture2D* getTexture() const override;

        //設置Sprite紋理(texture)的Rect尺寸(rect)、是否旋轉(rotated)、裁剪尺寸(untrimmedSize)。 
        //調用此方法會修改紋理(texture)的座標和頂點位置
        virtual void setTextureRect(const Rect& rect, bool rotated = false, const Size& untrimmedSize = rect.size); 


    /**
     * 精靈幀SpriteFrames & 動畫Animation
     *     - setSpriteFrame
     *     - isFrameDisplayed
     *     - getSpriteFrame
     *     - setDisplayFrameWithAnimationName
     */   
        //設置新的顯示精靈幀. 替代setDisplayFrame
        virtual void setSpriteFrame(const std::string &spriteFrameName);
        virtual void setSpriteFrame(SpriteFrame* newFrame);

        //返回精靈幀是否正在顯示
        virtual bool isFrameDisplayed(SpriteFrame *pFrame) const;

        //返回當前顯示的精靈幀. 替代 getDisplayFrame
        virtual SpriteFrame* getSpriteFrame() const;

        //通過動畫幀的第frameIndex那一幀來設置顯示精靈幀
        //動畫幀是從CCAnimationCache中讀取的
        virtual void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex);


    /**
     * 精靈屬性相關
     *     - setDirty
     *     - getQuad
     *     - isTextureRectRotated
     *     - setAtlasIndex
     *     - getTextureRect
     *     - setTextureAtlas
     *     - getOffsetPosition
     *     - setFlippedX , setFlippedY
     */
        //設置Sprite在紋理集Atlas中是否需要更新
        virtual void setDirty(bool dirty);
        virtual bool isDirty(void) const;

        //返回四個值的信息:座標(x,y),頂點,顏色
        inline V3F_C4B_T2F_Quad getQuad(void) const;

        //判斷紋理是否被旋轉
        inline bool isTextureRectRotated(void) const;

        //設置紋理集(TextureAtlas)的當前使用索引
        //警告: 除非你瞭解調用此方法的影響,否則不要改變此值
        inline void setAtlasIndex(ssize_t atlasIndex);
        inline ssize_t getAtlasIndex(void) const;

        //返回Sprite的Rect區域信息,單位點
        inline const Rect& getTextureRect(void);

        //如果採用批渲染,設置紋理地圖集
        inline void setTextureAtlas(TextureAtlas *pobTextureAtlas);
        inline TextureAtlas* getTextureAtlas(void);

        //獲取偏移值
        inline const Vec2& getOffsetPosition(void) const;

        //設置是否翻轉。
        void setFlippedX(bool flippedX); //設置Sprite是否水平翻轉。替代 setFlipX
        bool isFlippedX(void) const;
        void setFlippedY(bool flippedY); //設置Sprite是否垂直翻轉。替代 setFlipY
        bool isFlippedY(void) const;


    /**
     * 繼承於TextureProtocol
     *     - setBlendFunc
     */
        //設置顏色混合模式
        inline void setBlendFunc(const BlendFunc &blendFunc) override;
        inline const BlendFunc& getBlendFunc() const override;


    /**
     * 繼承於Node
     *     - Scale , Position , Skew , AnchorPoint , Visible
     *     - addChild , removeChild , reorderChild , sortAllChildren
     *     - draw , setOpacityModifyRGB , isOpacityModifyRGB
     */
        virtual void setScaleX(float scaleX) override;
        virtual void setScaleY(float scaleY) override;
        virtual void setScale(float scaleX, float scaleY) override;
        virtual void setScale(float scale) override;

        virtual void setPosition(const Vec2& pos) override;
        virtual void setPosition(float x, float y) override;
        virtual void setRotation(float rotation) override;
        virtual void setPositionZ(float positionZ) override;

        virtual void setSkewX(float sx) override;
        virtual void setSkewY(float sy) override;
        virtual void setRotationSkewX(float rotationX) override;
        virtual void setRotationSkewY(float rotationY) override;

        virtual void setAnchorPoint(const Vec2& anchor) override;
        virtual void ignoreAnchorPointForPosition(bool value) override;

        virtual void setVisible(bool bVisible) override;

        virtual void addChild(Node *child, int zOrder, int tag) override;
        virtual void addChild(Node *child, int zOrder, const std::string &name) override;
        virtual void removeChild(Node* child, bool cleanup) override;
        virtual void removeAllChildrenWithCleanup(bool cleanup) override;
        virtual void reorderChild(Node *child, int zOrder) override;
        virtual void sortAllChildren() override;

        virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
        virtual void setOpacityModifyRGB(bool modify) override;
        virtual bool isOpacityModifyRGB(void) const override;
    };
    //
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章