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

到这个问题,可能很多人早就知道了,这里就当做个记录好了。

之前用老版本用久了,貌似没有发现子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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值