zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    mycat分表扩展之全局序列(数据库方式)
    mycat分表扩展之按日期(天)分片
    mycat分表扩展之范围约定
    mycat分表扩展之分片枚举
    jdk导入证书链步骤说明
    oracle md5加密函数
    oracle常用(11g)
    oracle 11g 常规sql
    oracle归档日志
    oracle定时任务
  • 原文地址:https://www.cnblogs.com/xdao/p/cocos2dx_setOpaticy.html
Copyright © 2011-2022 走看看