看到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。

最新文章

  1. 毕业论文—使用js将canvas保存为图片文件,并且自定义文件名
  2. eclipse连hadoop2.x运行wordcount 转载
  3. 安装YouCompleteMe
  4. SQL Server DB Type and CLR Type
  5. marquee|各种文字滚动代码(适用公告)
  6. &lt;转&gt;Npoi导入导出Excel操作&lt;载&gt;
  7. 关于匿名类无法转换为object
  8. iOS 关于NSString的一些方法
  9. Jersey(1.19.1) - Building Responses
  10. Android Studio开发遇到程序崩溃问题
  11. 【Spark2.0源码学习】-9.Job提交与Task的拆分
  12. Keyboard Row
  13. 【工具大道】UML的点点滴滴
  14. php中函数里面使用函数外面的变量
  15. window下zookeeper的下载启动和报错等问题
  16. 运行第一个Python程序
  17. Oracle数据库操作基本语法
  18. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
  19. vue 开发系列(五) 调用原生API
  20. warning C4005 DXGI_STATUS_OCCLUDED

热门文章

  1. 基于restful注解(spring4.0.2整合flex+blazeds+spring-mvc)&lt;一&gt;
  2. mysql 索引长度的限制
  3. office excel2013如何启用solver选项
  4. 更简单更全的material design状态栏
  5. Lithium: HTML5 响应式的单页面模板
  6. 为SQL数据库创建登录名和密码
  7. Java之字节码(3) - 简单介绍
  8. TCP 中出现RST的情况
  9. centos 6.5安装docker报错(查看报错详细信息--推荐)
  10. Android开发之语音识别