Cocos2d-x CCNode 执行 CCFade~ 这类透明度变化动作的一些有关问题

在设置node透明度时我们时常会发现设置的透明度只对当前node有效果,而已它的子节点并不会有效果。
打开源代码我们会看到这两个方法

void Node::setOpacity(GLubyte opacity)
{
    _displayedOpacity = _realOpacity = opacity;
    
    updateCascadeOpacity();
}

void Node::updateDisplayedOpacity(GLubyte parentOpacity)
{
    _displayedOpacity = _realOpacity * parentOpacity/255.0;
    updateColor();
    
    if (_cascadeOpacityEnabled)
    {
        for(const auto& child : _children)
        {
            child->updateDisplayedOpacity(_displayedOpacity);
        }
    }
}

void Node::setCascadeOpacityEnabled(bool cascadeOpacityEnabled)
{
    if (_cascadeOpacityEnabled == cascadeOpacityEnabled)
    {
        return;
    }
    
    _cascadeOpacityEnabled = cascadeOpacityEnabled;
    
    if (cascadeOpacityEnabled)
    {
        updateCascadeOpacity();
    }
    else
    {
        disableCascadeOpacity();
    }
}

void Node::updateCascadeOpacity()
{
    GLubyte parentOpacity = 255;
    
    if (_parent != nullptr && _parent->isCascadeOpacityEnabled())
    {
        parentOpacity = _parent->getDisplayedOpacity();
    }
    
    updateDisplayedOpacity(parentOpacity);
}

```


可以看到
_cascadeOpacityEnabled有两个作用,一个是决定本节点的透明度是否会影响子节点的透明度,一个是决定本次修改是否连子节点一起修改。
所以当你所要做动画的对象只有两层对象的时候,只要对最顶层的对象做
setCascadeOpacityEnabled就行了。而如果将要做CCFade动画的对象超过三层就会有问题了,为什么呢?
首先你会发现你对节点做
setCascadeOpacityEnabled()操作,它只会改变自己的
_cascadeOpacityEnabled并不会改变它的子节点的
_cascadeOpacityEnabled值。并且
_cascadeOpacityEnabled初始值为false(很不明白为什么是false)这就造成了,我们要调用setOpcity方法设置透明度时,因为第二层节点的
_cascadeOpacityEnabled为false而不能使得透明度继续往它的子节点传递,从而使得只有第一、二层节点有透明度变化,第三层以后的没有。
     解决的方法就是对要做动画的节点做递归遍厉所有子节点对节点做
setCascadeOpacityEnabled(true)操作

直接把ccNode 创建的时候改掉 调一下setCascadeOpacityEnabled(true) cocos 的引擎不自己改点代码怎么能说用过:11:

对性能不会有影响吗

会有影响的,改变透明度与颜色传递,会降低帧数