在引擎中提供了几个有关透明度变化的动作: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不执行问题
看到下面的代码:
- @H_404_64@CCSizewinSize=CCDirector::sharedDirector()->getWinSize();
- CCSprite*bgSprite=CCSprite::create("HelloWorld.png"@H_404_64@);
- bgSprite->setPosition(ccp(winSize.width/2,winSize.height/2));
- this@H_404_64@->addChild(bgSprite);
- CCSprite*sprite=CCSprite::create("Icon.png"@H_404_64@);
- sprite->setPosition(ccp(200,200));
- bgSprite->addChild(sprite);
- CCFadeOut*fadeout=CCFadeOut::create(1);
- bgSprite->runAction(fadeout);
那么这个问题如何解决呢? --- 一个最笨的方法就是 去getChildren() 然后每一个子sprite再去执行这个动作。
那么,还有其他方法吗?
--有的。我们可以用setCascadeOpacityEnabled 这个方法。
在CCRGBAProtocol 类定义了这个方法:
/**
*whetherornotopacityshouldbepropagatedtoitschildren.
*/@H_404_64@
virtual@H_404_64@bool@H_404_64@isCascadeOpacityEnabled(void@H_404_64@)=0;
virtual@H_404_64@void@H_404_64@setCascadeOpacityEnabled(bool@H_404_64@cascadeOpacityEnabled)=0;
看到注释就知道是神马作用了,当设置为true的时候,父sprite执行opacity的变化,子sprite也同样会执行到这个变化。
再具体看看:
void@H_404_64@CCNodeRGBA::setCascadeOpacityEnabled(bool@H_404_64@cascadeOpacityEnabled)
{
_cascadeOpacityEnabled=cascadeOpacityEnabled;
}
void@H_404_64@updateDisplayedOpacity(GLubyteopacity)=0;
void@H_404_64@CCNodeRGBA::updateDisplayedOpacity(GLubyteparentOpacity)
_displayedOpacity=_realOpacity*parentOpacity/255.0;
if@H_404_64@(_cascadeOpacityEnabled)
CCObject*pObj;
CCARRAY_FOREACH(m_pChildren,pObj)
{
CCRGBAProtocol*item=dynamic_cast@H_404_64@<CCRGBAProtocol*>(pObj);
if@H_404_64@(item)
item->updateDisplayedOpacity(_displayedOpacity);
}
}
}
同样的,在这个类中还有这个方法:
*whetherornotcolorshouldbepropagatedtoitschildren.
bool@H_404_64@isCascadeColorEnabled(void@H_404_64@setCascadeColorEnabled(bool@H_404_64@cascadeColorEnabled)=0;
显然就是为了在父sprite执行颜色变化的时候,子sprite也可以执行到这个变化。
回到上面的代码例子,添加:bgSprite->setCascadeOpacityEnabled(true); 这条语句就没有问题了。
问题二:自定义的sprite执行 CCFade~ 的问题
我自定义了一个sprite类:在这个自定义的精灵内部又添加了两个子sprite。
@H_404_64@SelectedBoxSprite*SelectedBoxSprite::createWithPic(const@H_404_64@char@H_404_64@*name)
SelectedBoxSprite*pobView=new@H_404_64@SelectedBoxSprite();
if@H_404_64@(pobView&&pobView->initWithFile(name)&&pobView->setUpdateView()){
pobView->autorelease();
return@H_404_64@pobView;
CC_SAFE_DELETE(pobView);
return@H_404_64@NULL;
bool@H_404_64@SelectedBoxSprite::setUpdateView()
bool@H_404_64@isRet=false@H_404_64@;
do@H_404_64@{
this@H_404_64@->setCascadeOpacityEnabled(true@H_404_64@);
CCSprite*spr1=CCSprite::create("yellow.png"@H_404_64@);
spr1->setAnchorPoint(CCPointZero);
spr1->setTag(1);
spr1->setPosition(ccp(0,4));
this@H_404_64@->addChild(spr1);
listSpriteArray->addObject(spr1);
CCSprite*spr2=CCSprite::create("yellow_1.png"@H_404_64@);
spr2->setAnchorPoint(CCPointZero);
spr2->setTag(2);
spr2->setPosition(ccp(0,30));
this@H_404_64@->addChild(spr2);
listSpriteArray->addObject(spr2);
isRet=true@H_404_64@;
}while@H_404_64@(0);
return@H_404_64@isRet;
}
@H_404_64@SelectedBoxSprite*selectBoxSprite=SelectedBoxSprite::createWithPic("list_Box.png"@H_404_64@);
selectBoxSprite->setAnchorPoint(ccp(0.5,0.5));
selectBoxSprite->setPosition(ccp(300,305));
selectBoxSprite->setTag(2);
this@H_404_64@->addChild(selectBoxSprite,1);
CCFadeIn*fadein=CCFadeIn::create(1);
selectBoxSprite->runAction(fadein);
但是,发现有问题,就是这个自定义sprite里面的两个子sprite不会执行这个fade in动作 。
那么这么办呢?
那我就想 CCFadeOut 也会不会有这个问题呢
发现没有问题,这个自定义的sprite会fade out;
同样我又试了一下 CCFadeTo ,同样也是没有问题
这个时候,我冷静下来看看代码,发现原来 在fade in之前没有 将这个精灵的opacity设置为 0
//这个很重要,不要忘了@H_404_64@
selectBoxSprite->setOpacity(0);
CCFadeIn*fadein=CCFadeIn::create(1);
selectBoxSprite->runAction(fadein);
这样发现运行就正常了,里面的两个子sprite也会运行了。