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不执行问题
看到下面的代码:
- 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 类定义了这个方法:
@H_
772_155@
*/
virtualboolisCascadeOpacityEnabled(void)=0;
virtualvoidsetCascadeOpacityEnabled(@H_780_197@boolcascadeOpacityEnabled)=0;
@H_
607_205@
看到注释就知道是神马作用了,当设置为true的时候,父sprite执行opacity的变化,子sprite也同样会执行到这个变化。
再具体看看:
void
CCNodeRGBA::setCascadeOpacityEnabled(@H_780_
197@bool
cascadeOpacityEnabled)
{
_cascadeOpacityEnabled=cascadeOpacityEnabled;
}
@H_
607_205@
@H_
607_205@
void
CCNodeRGBA::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;
}