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::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

时间: 2024-11-08 09:51:56

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

Cocos2d-x开发---改变父节点颜色、透明度影响子节点

标题的意思是:当我们修改父节点的颜色或者透明度的时候,默认是不会对子节点产生影响的.在交流群里看见网友说可以通过设定某个参数来达到修改子节点相关属性的效果,就去看了看源码,记录下来: 引擎版本为:2.1.4 引擎中诸如CCSprite 设置颜色的时候是使用基类:CCNodeRGBA中的setColor 方法的.该方法的代码: void CCNodeRGBA::setColor(const ccColor3B& color) { _displayedColor = _realColor = col

cocos2dx[3.2](7) ——节点类Node

[唠叨] 与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加. [Node] Node类是绝大部分类的父类(并不是所有的类,例如Director类是直接继承Ref类的),如Scene.Layer.Sprite以及精灵集合SpriteBatchNode等等等等的父类都是Node. Node类包含了一些基本的属性.节点相关.Action动作的执行.以及定时器等相关的操作. 当然Node也有父类,其父类为Ref. 继承关系如下: 一个节点的主要特点: > 他们可以包含其他的节点对象(add

在EasyUI实现点击有子节点的文字时展开但不选中,点击最终子节点才选中的功能

最近做的项目中,总是会遇到需要实现点击树目录的有子节点时展开目录,点击最终子节点才实现选中的功能的需求.下边我就直接黏贴一下代码出来吧,非常容易看懂,关键的就是在选中事件中加一个判断. $('#RepairTID').combotree({        url: '/RepairSub/GetRepTypeZ/?userRole=5',        required: true,        panelHeight: 'auto',        onLoadSuccess: functi

Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象

本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来控制屏幕上的节点.如今就開始吧!     1. 增加节点    新建一个项目,并在HelloWorldScene.cpp文件里的init函数中做如代码清单3-2的代码所看到的的改动.     代码清单3-2 增加节点 bool HelloWorld::init() { if ( !CCLayer::init(

css 设置透明度

要设置某一元素的背景为透明,在 chrome .firefox.opera 下是这样的: [css] background-color:rgba(0, 0, 0,0.4);   rgba 中的最后一个参数 0.4 就是想要的透明度,范围在0-1之间. 在 ie 中一般是这样的: [css] background-color: rgb(0, 0, 0);   filter: alpha(opacity=40);   opacity 表示透明度,它的值范围在 0-100 之间   要相兼容可以实现以

cocos2d-x 3.0 绘图节点——Node

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 昨天写了个场景切换,折腾到半夜..好困的说... *************************** 照旧,先来个目录: 1.前言 2.从代码观节点 3.实际应用Node类 *************************** 1.前言 老样子,先来点干货

Oracle树查询(查询所有子节点,父节点等等)_转载

Oracle树查询(查询所有子节点,父节点等等) 转载 2016年01月14日 10:11:55 Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 以我做过的一个项目中的表为例,表结构如下: Sql代码 1

cocos2d-x 移植android横竖横屏设置

AndroidManifest.xml中android:screenOrientation字段控制屏幕方向,默认情况是横屏 android:screenOrientation="landscape" //横屏 android:screenOrientation="portrait"//坚屏 cocos2d-x 移植android横竖横屏设置,布布扣,bubuko.com

融合应用程序架构2或3节点设置(11.1.8更新)

融合应用程序架构2或3节点设置(11.1.8更新) inShare0 注:这篇文章更新11.1.8和11.1.7从我们上一次发布的关于11.1.6 2节点融合应用程序体系结构 http://www.oratraining.com/blog/2013/03/fusion-applications-architecture-for-2-node-setup/ 你问的很多问题关于如何安装融合应用3节点上因为我以前的安装指南展示单一节点或2节点安装(包括即将到来的一个). 根据Oracle建议使用至少2