看到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。