原帖地址
http://blog.csdn.net/crayondeng/article/details/12916711
在引擎中提供了幾個有關透明度變化的動作: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不執行問題
看到下面的代碼:
- CCSize winSize = 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);
那麼這個問題如何解決呢? --- 一個最笨的方法就是 去getChildren() 然後每一個子sprite再去執行這個動作。
那麼,還有其他方法嗎?
--有的。我們可以用 setCascadeOpacityEnabled 這個方法。
在 CCRGBAProtocol 類定義了這個方法:
- /**
- * whether or not opacity should be propagated to its children.
- */
- virtual bool isCascadeOpacityEnabled(void) = 0;
- virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled) = 0;
看到註釋就知道是神馬作用了,當設置爲true的時候,父sprite執行opacity的變化,子sprite也同樣會執行到這個變化。
再具體看看:
- void CCNodeRGBA::setCascadeOpacityEnabled(bool cascadeOpacityEnabled)
- {
- _cascadeOpacityEnabled = cascadeOpacityEnabled;
- }
- virtual void updateDisplayedOpacity(GLubyte opacity) = 0;
- void CCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity)
- {
- _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);
- }
- }
- }
- }
同樣的,在這個類中還有這個方法:
- /**
- * whether or not color should be propagated to its children.
- */
- virtual bool isCascadeColorEnabled(void) = 0;
- virtual void setCascadeColorEnabled(bool cascadeColorEnabled) = 0;
回到上面的代碼例子,添加: bgSprite->setCascadeOpacityEnabled(true); 這條語句就沒有問題了。
問題二:自定義的sprite執行 CCFade~ 的問題
我自定義了一個sprite類:在這個自定義的精靈內部又添加了兩個子sprite。
- SelectedBoxSprite* SelectedBoxSprite::createWithPic(const char *name)
- {
- SelectedBoxSprite* pobView = new SelectedBoxSprite();
- if (pobView && pobView->initWithFile(name) && pobView->setUpdateView()) {
- pobView->autorelease();
- return pobView;
- }
- CC_SAFE_DELETE(pobView);
- return NULL;
- }
- bool SelectedBoxSprite::setUpdateView()
- {
- bool isRet = 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);
- return isRet;
- }
- 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);
同樣我又試了一下 CCFadeTo ,同樣也是沒有問題
- CCFadeTo* fadeto = CCFadeTo::create(1, 0);
- selectBoxSprite->runAction(fadeto);
- //這個很重要,不要忘了
- selectBoxSprite->setOpacity(0);
- CCFadeIn* fadein = CCFadeIn::create(1);
- selectBoxSprite->runAction(fadein);
這樣發現運行就正常了,裏面的兩個子sprite也會運行了。