cocos2dx 设置父节点的显隐不能改变子节点的问题

简介: 在引擎中提供了几个有关透明度变化的动作:CCFadeIn,CCFadeOut,CCFadeToCCFadeIn:the opacity from 0 to 255CCFadeOut:the opacity from 255 to 0CCFadeTo: fro...

在引擎中提供了几个有关透明度变化的动作:CCFadeIn,CCFadeOut,CCFadeTo

CCFadeIn:the opacity from 0 to 255

CCFadeOut:the opacity from 255 to 0

CCFadeTo: from the current value to a custom one

   下面简单记录一下我所遇到的一些问题:


问题一:父Sprite执行fade动作,子Sprite不执行问题

看到下面的代码:

[cpp]  view plain copy
  1. CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  2.     CCSprite* bgSprite = CCSprite::create("HelloWorld.png");  
  3.     bgSprite->setPosition(ccp(winSize.width/2, winSize.height/2));  
  4.     this->addChild(bgSprite);  
  5.       
  6.     CCSprite* sprite = CCSprite::create("Icon.png");  
  7.     sprite->setPosition(ccp(200, 200));  
  8.     bgSprite->addChild(sprite);  
  9.       
  10.     CCFadeOut* fadeout = CCFadeOut::create(1);  
  11.     bgSprite->runAction(fadeout);  
分析:这里面的父sprite添加了一个子sprite,那么当父sprite执行fade out的动作,子sprite也是要一样执行fade out这个动作的,但是实际运行结果是,只有父sprite执行了这个动作,子sprite并没有执行。
那么这个问题如何解决呢? ---  一个最笨的方法就是 去getChildren() 然后每一个子sprite再去执行这个动作。

那么,还有其他方法吗?

--有的。我们可以用 setCascadeOpacityEnabled 这个方法。

在 CCRGBAProtocol 类定义了这个方法:

[cpp]  view plain copy
  1. /**  
  2.      *  whether or not opacity should be propagated to its children. 
  3.      */  
  4.     virtual bool isCascadeOpacityEnabled(void) = 0;  
  5.     virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled) = 0;  

      看到注释就知道是神马作用了,当设置为true的时候,父sprite执行opacity的变化,子sprite也同样会执行到这个变化。

再具体看看:

[cpp]  view plain copy
  1. void CCNodeRGBA::setCascadeOpacityEnabled(bool cascadeOpacityEnabled)  
  2. {  
  3.     _cascadeOpacityEnabled = cascadeOpacityEnabled;  
  4. }  

[cpp]  view plain copy
  1. virtual void updateDisplayedOpacity(GLubyte opacity) = 0;  

[cpp]  view plain copy
  1. void CCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity)  
  2. {  
  3.     _displayedOpacity = _realOpacity * parentOpacity/255.0;  
  4.       
  5.     if (_cascadeOpacityEnabled)  
  6.     {  
  7.         CCObject* pObj;  
  8.         CCARRAY_FOREACH(m_pChildren, pObj)  
  9.         {  
  10.             CCRGBAProtocol* item = dynamic_cast<CCRGBAProtocol*>(pObj);  
  11.             if (item)  
  12.             {  
  13.                 item->updateDisplayedOpacity(_displayedOpacity);  
  14.             }  
  15.         }  
  16.     }  
  17. }  

同样的,在这个类中还有这个方法:

[cpp]  view plain copy
  1. /** 
  2.      *  whether or not color should be propagated to its children. 
  3.      */  
  4.     virtual bool isCascadeColorEnabled(void) = 0;  
  5.     virtual void setCascadeColorEnabled(bool cascadeColorEnabled) = 0;  
显然就是为了在父sprite执行颜色变化的时候,子sprite也可以执行到这个变化。


回到上面的代码例子,添加: bgSprite->setCascadeOpacityEnabled(true);  这条语句就没有问题了。


问题二:自定义的sprite执行 CCFade~ 的问题

我自定义了一个sprite类:在这个自定义的精灵内部又添加了两个子sprite。

[cpp]  view plain copy
  1. SelectedBoxSprite* SelectedBoxSprite::createWithPic(const char *name)  
  2. {  
  3.     SelectedBoxSprite* pobView = new SelectedBoxSprite();  
  4.     if (pobView && pobView->initWithFile(name) && pobView->setUpdateView()) {  
  5.         pobView->autorelease();  
  6.         return pobView;  
  7.     }  
  8.     CC_SAFE_DELETE(pobView);  
  9.     return NULL;  
  10. }  
  11.   
  12. bool SelectedBoxSprite::setUpdateView()  
  13. {  
  14.     bool isRet = false;  
  15.     do {  
  16.         this->setCascadeOpacityEnabled(true);  
  17.           
  18.         CCSprite* spr1 = CCSprite::create("yellow.png");  
  19.         spr1->setAnchorPoint(CCPointZero);  
  20.         spr1->setTag(1);  
  21.         spr1->setPosition(ccp(0, 4));  
  22.         this->addChild(spr1);  
  23.           
  24.         listSpriteArray->addObject(spr1);  
  25.   
  26.         CCSprite* spr2 = CCSprite::create("yellow_1.png");  
  27.         spr2->setAnchorPoint(CCPointZero);  
  28.         spr2->setTag(2);  
  29.         spr2->setPosition(ccp(0, 30));  
  30.         this->addChild(spr2);  
  31.           
  32.         listSpriteArray->addObject(spr2);  
  33.           
  34.         isRet = true;  
  35.     } while (0);  
  36.     return isRet;  
  37. }  


我创建了这样的一个实例,想要执行CCFadeIn这个动作

[cpp]  view plain copy
  1. SelectedBoxSprite* selectBoxSprite = SelectedBoxSprite::createWithPic("list_box.png");  
  2.     selectBoxSprite->setAnchorPoint(ccp(0.5, 0.5));  
  3.     selectBoxSprite->setPosition(ccp(300, 305));  
  4.     selectBoxSprite->setTag(2);  
  5.     this->addChild(selectBoxSprite,1);  
  6.       
  7.     CCFadeIn* fadein = CCFadeIn::create(1);  
  8.     selectBoxSprite->runAction(fadein);  

但是,发现有问题,就是这个自定义sprite里面的两个子sprite不会执行这个fade in动作 奋斗

那么这么办呢?

那我就想 CCFadeOut 也会不会有这个问题呢

[cpp]  view plain copy
  1. CCFadeOut* fadeout = CCFadeOut::create(1);  
  2. selectBoxSprite->runAction(fadeout);  
发现没有问题,这个自定义的sprite会fade out;


同样我又试了一下 CCFadeTo ,同样也是没有问题

[cpp]  view plain copy
  1. CCFadeTo* fadeto = CCFadeTo::create(1, 0);  
  2. selectBoxSprite->runAction(fadeto);  
这个时候,我冷静下来看看代码,发现原来 在fade in之前没有 将这个精灵的opacity设置为 0 

[cpp]  view plain copy
  1. //这个很重要,不要忘了  
  2.     selectBoxSprite->setOpacity(0);  
  3.       
  4.     CCFadeIn* fadein = CCFadeIn::create(1);  
  5.     selectBoxSprite->runAction(fadein);  

这样发现运行就正常了,里面的两个子sprite也会运行了。

摘自:http://blog.csdn.net/crayondeng/article/details/12916711

相关文章
04zTree - 不显示节点图标的树
04zTree - 不显示节点图标的树
133 0
|
JavaScript 前端开发
js 各种位置获取全解(包括元素属性、鼠标位置、滚动位置)
js 各种位置获取全解(包括元素属性、鼠标位置、滚动位置)
js 各种位置获取全解(包括元素属性、鼠标位置、滚动位置)
|
JavaScript
Dom中偏移父节点及偏移位置
Dom中偏移父节点及偏移位置
182 0
Dom中偏移父节点及偏移位置
|
JavaScript API 开发者
10、DOM基础(元素节点、属性节点、文本节点、轮播图、改变颜色、选中取消)
10、DOM基础(元素节点、属性节点、文本节点、轮播图、改变颜色、选中取消)
127 0
10、DOM基础(元素节点、属性节点、文本节点、轮播图、改变颜色、选中取消)
|
JavaScript
VUE element-ui之el-tree树形控件循环遍历渲染dom节点;子节点横向排列;控件添加指示线
VUE element-ui之el-tree树形控件循环遍历渲染dom节点;子节点横向排列;控件添加指示线
1001 0
VUE element-ui之el-tree树形控件循环遍历渲染dom节点;子节点横向排列;控件添加指示线
13zTree - 展开 / 折叠父节点控制
13zTree - 展开 / 折叠父节点控制
65 0
13zTree - 展开 / 折叠父节点控制
|
JSON 前端开发 JavaScript
07zTree - 显示自定义字体的树
07zTree - 显示自定义字体的树
76 0
WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/7971771 WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色      在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件进行控制,但对于WinForm则没有这样方便。
1163 0
|
iOS开发 前端开发 JavaScript
关于iphone 上touch事件动态改变元素位置时与touch点发生偏移的问题
写这个么个题目好像,有点晦涩。直接来张gif图就知道,主要是是当手指触摸到元素时,元素的初始位置变成了left:0, top:0; js 设置监听事件 都是 一样的套路  touch.
1403 0

热门文章

最新文章