Cocos2dx的ZOrder见解

来源:互联网 发布:2017淘宝卖什么成本低 编辑:程序博客网 时间:2024/06/04 18:30

ZOrder分localZOrder和gobalZOrder,gobalZOrder优先级比localZOrder高,gobalZOrder影响DrawElements的提交顺序,localZOrder提交到renderer的顺序

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


Node:visit()内部实现

children: <0 self:draw >0

先绘制localZOrder<0的子节点

然后绘制自己

最后绘制localZOrder>0子节点


来一段CCNode的visit函数源代码:

void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags){    // quick return if not visible. children won't be drawn.    if (!_visible)    {        return;    }    uint32_t flags = processParentFlags(parentTransform, parentFlags);    // IMPORTANT:    // To ease the migration to v3.0, we still support the Mat4 stack,    // but it is deprecated and your code should not rely on it    _director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);    _director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);        bool visibleByCamera = isVisitableByVisitingCamera();    int i = 0;    if(!_children.empty())    {        sortAllChildren();        // draw children zOrder < 0        for( ; i < _children.size(); i++ )        {            auto node = _children.at(i);            if (node && node->_localZOrder < 0)                node->visit(renderer, _modelViewTransform, flags);            else                break;        }        // self draw        if (visibleByCamera)            this->draw(renderer, _modelViewTransform, flags);        for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)            (*it)->visit(renderer, _modelViewTransform, flags);    }    else if (visibleByCamera)    {        this->draw(renderer, _modelViewTransform, flags);    }    _director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);        // FIX ME: Why need to set _orderOfArrival to 0??    // Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920    // reset for next frame    // _orderOfArrival = 0;}


0 0