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。
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。