cocos2dx對所有子節點設置透明度


看到cocos2dx2.2.5發布了,修復了輸入框的bug,於是我們的項目也升級到了2.2.5,

升級過程還是比較順利,沒想到后來發現設置透明度無效了。

經過調試發現要調用一下setCascadeOpacityEnabled(true),結果還是沒有效果,

又繼續調試,原來noe沒父節點不會更新自己的透明度,於是改為如下:

void CCNode::setOpacity(GLubyte opacity)

{

    m_displayedOpacity = m_realOpacity = opacity;

 

if (m_cascadeOpacityEnabled)

    {

GLubyte parentOpacity = 255;

        if (m_pParent && m_pParent->isCascadeOpacityEnabled())

        {

            parentOpacity = m_pParent->getDisplayedOpacity();

        }else //這里沒有父節點也更新

        {

            this->updateDisplayedOpacity(opacity);

            return;

        }

        this->updateDisplayedOpacity(parentOpacity);

    }

 

}

 

因為我們的代碼里好多地方都是設置好節點的屬性后再addchild,如果不這么改,好多地方

都要修改。感覺這個設計有點坑人。

但是發現還是不行,原來在updateDisplayedOpacity還會判斷isCascadeOpacityEnabled,

這樣如果有一個子節點的開關是false,就不能更新透明度了。

然而,我們是從ccb里讀取的,不知道ccb里有多少個子節點,所以便修改讀取ccb的代碼,

286行

CCDICT_FOREACH(animationManagers, pElement)

    {

        CCNode* pNode = (CCNode*)pElement->getIntKey();

 

        pNode->setCascadeOpacityEnabled(true);//打開透明度

 

727行

/* Read and add children. */

    int numChildren = this->readInt(false);

    for(int i = 0; i < numChildren; i++) {

        CCNode * child = this->readNodeGraph(node);

        child->setCascadeOpacityEnabled(true); //打開透明度

        node->addChild(child);

 

    }

 

由於默認關閉透明度,setOpacity無效,這個函數真是名不副實,既然我們要設置透明度,

那么就應該給打開。不吐槽了。

后來想,可以直接添加一個setOpacityAll函數,之間對所有子節點設置透明度,也不需要

再次調用setCascadeOpacityEnabled。

在ccnode.h里添加一個保護成員bool m_opacityAll,在構造函數初始化列表里初始化為false。

 

 

void CCNode::setOpacityAll(GLubyte opacity)

{

 

m_cascadeOpacityEnabled=true;

m_opacityAll=true;

setOpacity(opacity);//這個set要和上面一樣修改,如果不修改只能在addchild后才能調用

}

 

修改updateDisplayedOpacity如下

void CCNode::setOpacityAllEnabled(bool flag)
{
    m_opacityAll=flag;
}
void CCNode::updateDisplayedOpacity(GLubyte parentOpacity)
{
    m_displayedOpacity = (GLubyte)(m_realOpacity * parentOpacity/255.0);

    if (m_cascadeOpacityEnabled)
    {
        
        CCObject* pObj;
        CCNode* pNode;
        CCARRAY_FOREACH(m_pChildren, pObj)
        {
            if ( m_opacityAll)
            {
                pNode=dynamic_cast<CCNode*>(pObj);
                pNode->setCascadeOpacityEnabled(true);
                pNode->setOpacityAllEnabled(true);
                pNode->updateDisplayedOpacity(m_displayedOpacity);
            }
            
        }
    }
}

 

 這樣就可以對所有子節點設置透明度了,其實可以直接修改setopacity的代碼,但是不知道是否有其它影響

所以只好又加了個setopacityall的開關,這樣不需要傳遞的還可以用setopacity。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM