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 函数)。

原文地址:https://www.cnblogs.com/chenshi/p/4106767.html