看到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 = ;

        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。

cocos2dx对所有子节点设置透明度的更多相关文章

  1. cocos2dx[3.2](6) 节点类Node

    与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加. Node类是绝大部分类的父类(并不是所有的类,例如Director类是直接继承Ref类的),如Scene.Layer.Sprite以及 ...

  2. T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...

  3. SQL查询树形结构的所有子节点

    如下一张表test:id name pid----------- ---------- -----------1 电器 NULL2 家电 13 冰箱 24 洗衣机 25 电脑 16 笔记本 57 平板 ...

  4. css中怎么设置透明度的问题

    小伙伴们是不是在找怎么样去设置页面的透明度的方法呢...别找了,我这儿就有,而且肯定够用了. 我自己会用到的就有两种,可以和大家分享一下. 1.用opcity的方法去设置透明度.代码如下: .div ...

  5. SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)

    --------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...

  6. IOS 设置透明度导致底层View始终可见

    正确效果如图:下面的toolBar应该看不见它下面的View, 避免方法:[self.view  addSubView:aSubView];这个aSubView一定不能设置不透明度,应将其设置为Cle ...

  7. MySQL中进行树状所有子节点的查询

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

  8. 给节点设置tag【从零開始cocos3.0final 】

    在cocos中通过tag来管理节点是非经常常使用的:以下介绍一个关于在cocos中使用tag的实例: typedef enum{ tag1 }Tag; 这里能够使用枚举类型,来为多个节点设置tag: ...

  9. SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

    ---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...

随机推荐

  1. mysql的日志管理

    日志操作是数据库维护中最重要的手段之一,日志文件会记录MySQL服务器的各种信息,所以当MySQL服务器遭到意外损坏时,不仅可以通过日志文件来查看出错的原因,而且还可以通过日志文件进行数据恢复. MY ...

  2. 值得阅读的C语言开源项目代码

    本文地址:http://www.cnblogs.com/archimedes/p/c-opensource-project.html,转载请注明源地址. 本篇文章主要总结一些C开源项目,有些是很著名的 ...

  3. oracle 11g physical standby switchover

    简介 SWITCHOVERS主要是在计划停机维护时用来降低DOWNTIME,如硬件维护.操作系统升级或是数据库rolling upgrade, 也可用来进行特殊情况下的数据库迁移. SWITCHOVE ...

  4. 更新后android studio 2.0 构建gradle卡在Refreshing Gradle Project 解决办法

    首先打开android studio项目 找到项目目录gradle\wrapper\gradle-wrapper.properties这个文件 你会看到 #Wed Apr 10 15:27:10 PD ...

  5. T-SQL 之 控制流语句

    控制流语句也称为流程控制语句,是和高级编程语言中的类似功能一致的,引入控制流语句将使T-SQL代码有顺序执行转变为按控制执行. 批处理:一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理 ...

  6. SpriteKit改变Node锚点其物理对象位置不对的解决

    在创建Node的物理对象后,默认情况下物理对象和Node的实际边界相应的非常好,由于此时Node的默认锚点是当中心位置即(0.5,0.5),只是假设我们改变了Node的锚点,就会发现其物理边界还是保持 ...

  7. 开源微内核seL4

    微内核 越大的系统潜在的bug就越多.所以微内核在降低bug方面非常有优势,seL4是世界上最小的内核之中的一个.可是seL4的性能能够与当今性能最好的微内核相比. 作为微内核,seL4为应用程序提供 ...

  8. OpenERP7.0中非admin帐号新增其它用户问题

    在OpenERP7.0中,通过admin新增了一个管理员帐号,然后登录管理员帐号,再新增其它用户时提示错误,系统提示对users没有create权限. 经测试了解,是因为安装了多公司模块后,在记录规则 ...

  9. 从0开始搭建symphony

    目标:在本地服务器中运行symphonyX 困难:=.= 基本全是困难…服务器重装了win/ubuntu/centos均不识别网卡,也是醉了. 1.通过Eclipse进行配置. 一开始以为需要单独下载 ...

  10. centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)

    准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...