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 = ;
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对所有子节点设置透明度的更多相关文章
- cocos2dx[3.2](6) 节点类Node
与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加. Node类是绝大部分类的父类(并不是所有的类,例如Director类是直接继承Ref类的),如Scene.Layer.Sprite以及 ...
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
-- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...
- SQL查询树形结构的所有子节点
如下一张表test:id name pid----------- ---------- -----------1 电器 NULL2 家电 13 冰箱 24 洗衣机 25 电脑 16 笔记本 57 平板 ...
- css中怎么设置透明度的问题
小伙伴们是不是在找怎么样去设置页面的透明度的方法呢...别找了,我这儿就有,而且肯定够用了. 我自己会用到的就有两种,可以和大家分享一下. 1.用opcity的方法去设置透明度.代码如下: .div ...
- SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)
--------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...
- IOS 设置透明度导致底层View始终可见
正确效果如图:下面的toolBar应该看不见它下面的View, 避免方法:[self.view addSubView:aSubView];这个aSubView一定不能设置不透明度,应将其设置为Cle ...
- MySQL中进行树状所有子节点的查询
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...
- 给节点设置tag【从零開始cocos3.0final 】
在cocos中通过tag来管理节点是非经常常使用的:以下介绍一个关于在cocos中使用tag的实例: typedef enum{ tag1 }Tag; 这里能够使用枚举类型,来为多个节点设置tag: ...
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...
随机推荐
- 各浏览器CSS兼容问题
CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并 整理了一下.对于web2.0的过度,请尽量用xhtml ...
- SQL OUTER JOIN
When we want to select out all the record from two table, no matter it's present at second table or ...
- 利用shell监控cpu、磁盘、内存使用率
利用shell监控cpu.磁盘.内存使用率,达到警报阈值发邮件进行通知 并配合任务计划,即可及时获取报警信息 #!/bin/bash ################################# ...
- AjaxPro因为汉字文件夹引发的IE兼容性问题
公司一老项目.须要使用AjaxPro.引用dll,config配置,pageload注冊一直都没有问题. google浏览器測试成功. 奇怪的是在IE中英勇的爆掉了... .. 报错: eval(&q ...
- dTree无限级文件夹树和JQuery同步Ajax请求
曾经都是用JQuery对树的支持来实现文件夹树的,近来闲来无事就弄了下dTree,感觉其无限级文件夹还是挺好的,并且它的使用也比較方便,基本上就是先把要用的js文件即dtree.js和css文件dtr ...
- 性能调优的Windows窗体DataGridView控件
性能调优的Windows窗体DataGridView控件 . 净框架4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你 ...
- 小贝_redis高级应用-公布与订阅
redis高级应用-公布与订阅 一.公布与订阅(pub/sub)功能 二.公布与订阅(pub/sub)机制 三.redis公布与订阅(pub/sub)的实现 一.公布与订阅(pub/sub)功能 Pu ...
- 【Leet Code】String to Integer (atoi) ——常考类型题
String to Integer (atoi) Total Accepted: 15482 Total Submissions: 106043My Submissions Implement ato ...
- Python模块学习 --- urllib
urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据.每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种“痛苦”的表情.我以前翻 ...
- Java之JVM调优案例分析与实战(3) - 堆外内存导致的溢出错误
环境:基于B\S的点子考试系统,为了发现客户端能实时地从服务端接收考试数据,系统使用了逆向AJAX技术(也称Comet或Server Side Push),选用CometD1.1.1作为服务端推送框架 ...