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

前端之家收集整理的这篇文章主要介绍了cocos2dx 设置父节点的显隐不能改变子节点的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在引擎中提供了几个有关透明度变化的动作: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不执行问题

看到下面的代码

  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.jb51.cc/article/p-zlgucdji-yt.html

    原文链接:https://www.f2er.com/cocos2dx/345458.html

    猜你在找的Cocos2d-x相关文章