Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 类定义了这个方法

@H_772_155@/**
  • *whetherornotopacityshouldbepropagatedtoitschildren.
  • */
  • virtualboolisCascadeOpacityEnabled(void)=0;
  • virtualvoidsetCascadeOpacityEnabled(@H_780_197@boolcascadeOpacityEnabled)=0;
  • @H_607_205@

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

    再具体看看:

    voidCCNodeRGBA::setCascadeOpacityEnabled(@H_780_197@boolcascadeOpacityEnabled)
  • {
  • _cascadeOpacityEnabled=cascadeOpacityEnabled;
  • }
  • @H_607_205@
    voidupdateDisplayedopacity(GLubyteopacity)=0;
    @H_607_205@
    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);
  • }
  • }
  • }
  • @H_607_205@

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

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


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


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

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

    @H_772_155@SELEctedBoxSprite*SELEctedBoxSprite::createWithPic(const@H_780_197@char*Name)
  • SELEctedBoxSprite*pobView=newSELEctedBoxSprite();
  • if(pobView&&pobView->initWithFile(Name)&&pobView->setupdateView()){
  • pobView->autorelease();
  • returnpobView;
  • CC_SAFE_deletE(pobView);
  • returnNULL;
  • @H_780_197@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这个动作

    @H_772_155@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);
  • @H_607_205@ 但是,发现有问题,就是这个自定义sprite里面的两个子sprite不会执行这个fade in动作 @H_607_205@

    那么这么办呢?

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

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


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

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

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

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

    摘自:http://www.voidcn.com/article/p-zlgucdji-yt.html

    大佬总结

    以上是大佬教程为你收集整理的cocos2dx 设置父节点的显隐不能改变子节点的问题全部内容,希望文章能够帮你解决cocos2dx 设置父节点的显隐不能改变子节点的问题所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
    标签:cocoscocos2dxdx不能改变节点设置问题
    猜你在找的Cocos2d-x相关文章
    其他相关热搜词更多
    phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap