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

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

发布时间:2020-12-14 19:49:04 所属栏目:百科 来源:网络整理
导读:在引擎中提供了几个有关透明度变化的动作: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 类定义了这个方法:

/**
  • *whetherornotopacityshouldbepropagatedtoitschildren.
  • */
  • virtualboolisCascadeOpacityEnabled(void)=0;
  • virtualvoidsetCascadeOpacityEnabled(boolcascadeOpacityEnabled)=0;

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

    再具体看看:

    voidCCNodeRGBA::setCascadeOpacityEnabled(boolcascadeOpacityEnabled)
  • {
  • _cascadeOpacityEnabled=cascadeOpacityEnabled;
  • }

  • voidupdateDisplayedOpacity(GLubyteopacity)=0;

    voidCCNodeRGBA::updateDisplayedOpacity(GLubyteparentOpacity)
  • _displayedOpacity=_realOpacity*parentOpacity/255.0;
  • if(_cascadeOpacityEnabled)
  • CCObject*pObj;
  • CCARRAY_FOREACH(m_pChildren,pObj)
  • {
  • CCRGBAProtocol*item=dynamic_cast<CCRGBAProtocol*>(pObj);
  • if(item)
  • item->updateDisplayedOpacity(_displayedOpacity);
  • }
  • }
  • }

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

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


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


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

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

    SelectedBoxSprite*SelectedBoxSprite::createWithPic(constchar*name)
  • SelectedBoxSprite*pobView=newSelectedBoxSprite();
  • if(pobView&&pobView->initWithFile(name)&&pobView->setUpdateView()){
  • pobView->autorelease();
  • returnpobView;
  • CC_SAFE_DELETE(pobView);
  • returnNULL;
  • boolSelectedBoxSprite::setUpdateView()
  • boolisRet=false;
  • do{
  • this->setCascadeOpacityEnabled(true);
  • CCSprite*spr1=CCSprite::create("yellow.png");
  • spr1->setAnchorPoint(CCPointZero);
  • spr1->setTag(1);
  • spr1->setPosition(ccp(0,4));
  • this->addChild(spr1);
  • listSpriteArray->addObject(spr1);
  • CCSprite*spr2=CCSprite::create("yellow_1.png");
  • spr2->setAnchorPoint(CCPointZero);
  • spr2->setTag(2);
  • spr2->setPosition(ccp(0,30));
  • this->addChild(spr2);
  • listSpriteArray->addObject(spr2);
  • isRet=true;
  • }while(0);
  • returnisRet;
  • }

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

    SelectedBoxSprite*selectBoxSprite=SelectedBoxSprite::createWithPic("list_box.png");
  • selectBoxSprite->setAnchorPoint(ccp(0.5,0.5));
  • selectBoxSprite->setPosition(ccp(300,305));
  • selectBoxSprite->setTag(2);
  • this->addChild(selectBoxSprite,1);
  • CCFadeIn*fadein=CCFadeIn::create(1);
  • selectBoxSprite->runAction(fadein);

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

    那么这么办呢?

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

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


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

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

    //这个很重要,不要忘了
  • selectBoxSprite->setOpacity(0);
  • CCFadeIn*fadein=CCFadeIn::create(1);
  • selectBoxSprite->runAction(fadein);

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

    摘自:http://www.52php.cn/article/p-zlgucdji-yt.html

    (编辑:李大同)

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

      推荐文章
        热点阅读