Cocos2d之Node類詳解之ZOrder詳解


一、聲明

筆者以cocos2d框架的cocos2d-x-3.3rc0版本源碼做分析。本文屬於筆者原創,允許轉載和分享,但請注明文章出處。

二、簡介

ZOrder

ZOrder顧名思義就是節點(Node對象)在Z軸上的排序,這樣一來ZOrder越小就越優先顯示。每個節點(Node對象)可以持有多個子節點,組成節點樹(關於節點樹的介紹查看《Cocos2d之Node類詳解之節點樹》一文)。ZOder表示了節點樹中每個子節點顯示的優先級。值得注意的是,節點樹中子節點的ZOder可能會一樣,這種情況下父節點就根據每個子節點的 _orderOfArrival 屬性來判斷子節點的顯示順序。orderOfArrival是表示子節點被添加的順序,越小則子節點顯示的優先級越高。

Node類中聲明了兩個ZOrder屬性。

int _localZOrder;               ///< Local order (relative to its siblings) used to sort the node
float _globalZOrder;            ///< Global order used to sort the node

LocalZOrder

前面提到過,每一個父節點都可以持有一個節點樹。節點樹中的子節點的 _localZOrder 屬性會作為該子節點與其他兄弟姐妹子節點間排序的關鍵字。節點樹的父節點會依據這個值來對所有的子節點進行排序。_localZOrder < 0 表示子節點放在節點樹的左子樹中,_localZOrder >= 0 表示子節點放在節點樹的右子樹中。

三、源碼詳解

設置LocalZOrder

相關函數聲明。

/**
     LocalZOrder is the 'key' used to sort the node relative to its siblings.

     The Node's parent will sort all its children based ont the LocalZOrder value.
     If two nodes have the same LocalZOrder, then the node that was added first to the children's array will be in front of the other node in the array.
     
     Also, the Scene Graph is traversed using the "In-Order" tree traversal algorithm ( http://en.wikipedia.org/wiki/Tree_traversal#In-order )
     And Nodes that have LocalZOder values < 0 are the "left" subtree
     While Nodes with LocalZOder >=0 are the "right" subtree.
     
     @see `setGlobalZOrder`
     @see `setVertexZ`
     */
    virtual void setLocalZOrder(int localZOrder);

    CC_DEPRECATED_ATTRIBUTE virtual void setZOrder(int localZOrder) { setLocalZOrder(localZOrder); }
    
    /* Helper function used by `setLocalZOrder`. Don't use it unless you know what you are doing.
     */
    CC_DEPRECATED_ATTRIBUTE virtual void _setLocalZOrder(int z);

    /**
     * Gets the local Z order of this node.
     *
     * @see `setLocalZOrder(int)`
     *
     * @return The local (relative to its siblings) Z order.
     */
    virtual int getLocalZOrder() const { return _localZOrder; }
    CC_DEPRECATED_ATTRIBUTE virtual int getZOrder() const { return getLocalZOrder(); }

從聲明中可以看出,設置LocalZOrder屬性的主要函數是 setLocalZOrder(int localZOrder),下面看這個函數的實現。

void Node::setLocalZOrder(int z)
{
    if (_localZOrder == z)
        return;
    
    _localZOrder = z;
    if (_parent)
    {
        _parent->reorderChild(this, z);
    }

    _eventDispatcher->setDirtyForNode(this);
}

    從源碼可以看出,如果Node對象存在父節點(也就是說該對象在父節點的節點樹中),Node對象改變 _localZOrder 的值后會調用父節點的 reorderChild 函數對子節點進行重新排序(筆者在《Cocos2d之Node類詳解之節點樹(二)》一文的“節點樹重排序”部分有介紹 reorderChild 函數)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM