加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 19:49:12 所属栏目:百科 来源:网络整理
导读:在引擎中提供了几个有关透明度变化的动作: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 下面简单记录一下我所遇到的一些问题: 问题一

在引擎中提供了几个有关透明度变化的动作: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. 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(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.52php.cn/article/p-zlgucdji-yt.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读