]cocos2d-x里子Sprite随父Sprite透明度变化

来源:互联网 发布:自动刷屏软件 编辑:程序博客网 时间:2024/04/30 21:21
到这个问题,可能很多人早就知道了,这里就当做个记录好了。

之前用老版本用久了,貌似没有发现子Sprite会随父Sprite的透明设置Opacity变化而变化。所以之前有Sprite嵌套的情况下处理的办法都是在每帧更新的时候去手动加上设置Opacity的代码。
比如
update()
{
this->setOpacity(getParent()->getOpacity());
}

最近在新版本cocos2d-x代码里偶然发现这个方法(估计2.1版本加上去的吧,具体不清楚),直接设置就OK了。
CCSprite::setCascadeOpacityEnabled 
翻看源码,这两个函数彻底说明了它的作用。
voidCCNodeRGBA::setOpacity(GLubyte opacity)
{
    _displayedOpacity =_realOpacity = opacity;
    
if(_cascadeOpacityEnabled)
    {
GLubyteparentOpacity = 255;
       CCRGBAProtocol* pParent =dynamic_cast(m_pParent);
       if (pParent &&pParent->isCascadeOpacityEnabled())
       {
          parentOpacity = pParent->getDisplayedOpacity();
       }
      this->updateDisplayedOpacity(parentOpacity);
}
}

voidCCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity)
{
_displayedOpacity = _realOpacity * parentOpacity/255.0;
    if(_cascadeOpacityEnabled)
    {
       CCObject* pObj;
       CCARRAY_FOREACH(m_pChildren, pObj)
       {
          CCRGBAProtocol* item = dynamic_cast(pObj);
           if(item)
           {
             item->updateDisplayedOpacity(_displayedOpacity);
           }
       }
    }
}
代码中,当setCascadeOpacityEnabled为true时,子Sprite设置Opacity的时候会参考父Sprite的Opacity值做处理;而设置父Sprite的Opacity值时,也同时会更新子Sprite的Opacity显示。起到了透明设置的传递作用。所以之前的每帧更新的代码就可以删掉了,省不少事。

同理,还有个函数setCascadeColorEnabled相当于传递了颜色设置的作用,这里就不做更多说明了。
0 0