微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

CCFadeIn:the opacity from 0 to 255

CCFadeOut:the opacity from 255 to 0

CCFadetofrom the current value to a custom one

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


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

看到下面的代码

  1. CCSizewinSize=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. CCSprite*sprite=CCSprite::create("Icon.png");
  6. sprite->setPosition(ccp(200,200));
  7. bgSprite->addChild(sprite);
  8. CCFadeOut*fadeout=CCFadeOut::create(1);
  9. bgSprite->runAction(fadeout);
分析:这里面的父sprite添加一个子sprite,那么当父sprite执行fade out的动作,子sprite也是要一样执行fade out这个动作的,但是实际运行结果是,只有父sprite执行了这个动作,子sprite并没有执行。
那么这个问题如何解决呢? --- 一个最笨的方法就是 去getChildren() 然后每一个子sprite再去执行这个动作。

那么,还有其他方法吗?

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

CCRGBAProtocol 类定义了这个方法

copy
    /**
  1. *whetherornotopacityshouldbepropagatedtoitschildren.
  2. */
  3. virtualboolisCascadeOpacityEnabled(void)=0;
  4. virtualvoidsetCascadeOpacityEnabled(boolcascadeOpacityEnabled)=0;

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

再具体看看:

copy
    voidCCNodeRGBA::setCascadeOpacityEnabled(boolcascadeOpacityEnabled)
  1. {
  2. _cascadeOpacityEnabled=cascadeOpacityEnabled;
  3. }

copy
    voidupdatedisplayedOpacity(glubyteopacity)=0;

copy
    voidCCNodeRGBA::updatedisplayedOpacity(glubyteparentOpacity)
  1. _displayedOpacity=_realOpacity*parentOpacity/255.0;
  2. if(_cascadeOpacityEnabled)
  3. CCObject*pObj;
  4. CCARRAY_FOREACH(m_pChildren,pObj)
  5. {
  6. CCRGBAProtocol*item=dynamic_cast<CCRGBAProtocol*>(pObj);
  7. if(item)
  8. item->updatedisplayedOpacity(_displayedOpacity);
  9. }
  10. }
  11. }

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

copy
    *whetherornotcolorshouldbepropagatedtoitschildren.
  1. boolisCascadeColorEnabled(voidsetCascadeColorEnabled(boolcascadeColorEnabled)=0;
显然就是为了在父sprite执行颜色变化的时候,子sprite也可以执行到这个变化。


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


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

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

copy
    SelectedBoxSprite*SelectedBoxSprite::createWithPic(constchar*name)
  1. SelectedBoxSprite*pobView=newSelectedBoxSprite();
  2. if(pobView&&pobView->initWithFile(name)&&pobView->setUpdateView()){
  3. pobView->autorelease();
  4. returnpobView;
  5. CC_SAFE_DELETE(pobView);
  6. returnNULL;
  7. boolSelectedBoxSprite::setUpdateView()
  8. boolisRet=false;
  9. do{
  10. this->setCascadeOpacityEnabled(true);
  11. CCSprite*spr1=CCSprite::create("yellow.png");
  12. spr1->setAnchorPoint(CCPointZero);
  13. spr1->setTag(1);
  14. spr1->setPosition(ccp(0,4));
  15. this->addChild(spr1);
  16. listSpriteArray->addobject(spr1);
  17. CCSprite*spr2=CCSprite::create("yellow_1.png");
  18. spr2->setAnchorPoint(CCPointZero);
  19. spr2->setTag(2);
  20. spr2->setPosition(ccp(0,30));
  21. this->addChild(spr2);
  22. listSpriteArray->addobject(spr2);
  23. isRet=true;
  24. }while(0);
  25. returnisRet;
  26. }


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

copy
    SelectedBoxSprite*selectBoxSprite=SelectedBoxSprite::createWithPic("list_Box.png");
  1. selectBoxSprite->setAnchorPoint(ccp(0.5,0.5));
  2. selectBoxSprite->setPosition(ccp(300,305));
  3. selectBoxSprite->setTag(2);
  4. this->addChild(selectBoxSprite,1);
  5. CCFadeIn*fadein=CCFadeIn::create(1);
  6. selectBoxSprite->runAction(fadein);

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

那么这么办呢?

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

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


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

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

copy
    //这个很重要,不要忘了
  1. selectBoxSprite->setopacity(0);
  2. CCFadeIn*fadein=CCFadeIn::create(1);
  3. selectBoxSprite->runAction(fadein);

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

摘自:http://www.jb51.cc/article/p-zlgucdji-yt.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐