在设置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)操作
