码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2dx对所有子节点设置透明度

时间:2014-07-23 22:25:57      阅读:403      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   

看到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::updateDisplayedOpacity(GLubyte parentOpacity)

{

m_displayedOpacity = (GLubyte)(m_realOpacity * parentOpacity/255.0);

 

    if (m_cascadeOpacityEnabled || m_opacityAll)//这里修改

    {

        CCObject* pObj;

        CCARRAY_FOREACH(m_pChildren, pObj)

        {

            dynamic_cast<CCNode*>(pObj)->updateDisplayedOpacity(m_displayedOpacity);

        }

    }

 

}

 

 

这样就可以对所有子节点设置透明度了。

cocos2dx对所有子节点设置透明度,布布扣,bubuko.com

cocos2dx对所有子节点设置透明度

标签:style   blog   color   os   io   for   

原文地址:http://www.cnblogs.com/xdao/p/cocos2dx_setOpaticy.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!