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

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

概述在引擎中提供了几个有关透明度变化的动作: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    下面简单记录一下我所遇到的一些问题: 问题一:父Sprit

在引擎中提供了几个有关透明度变化的动作: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 CCSizewinSize=CCDirector::sharedDirector()->getWinSize(); CCSprite*bgSprite=CCSprite::create("HelloWorld.png"); bgSprite->setposition(ccp(winSize.wIDth/2,winSize.height/2)); this->addChild(bgSprite); CCSprite*sprite=CCSprite::create("Icon.png"); sprite->setposition(ccp(200,200)); bgSprite->addChild(sprite); CCFadeOut*fadeout=CCFadeOut::create(1); 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

总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1023495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存