您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x Sprite 执行 CCFade~ 这类透明度变化动作的一些问题

2014-07-16 12:31 441 查看
在引擎中提供了几个有关透明度变化的动作: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 plaincopy

01.CCSize winSize = CCDirector::sharedDirector()->getWinSize();

02. CCSprite* bgSprite = CCSprite::create("HelloWorld.png");

03. bgSprite->setPosition(ccp(winSize.width/2, winSize.height/2));

04. this->addChild(bgSprite);

05.

06. CCSprite* sprite = CCSprite::create("Icon.png");

07. sprite->setPosition(ccp(200, 200));

08. bgSprite->addChild(sprite);

09.

10. CCFadeOut* fadeout = CCFadeOut::create(1);

11. bgSprite->runAction(fadeout);

分析:这里面的父sprite添加了一个子sprite,那么当父sprite执行fade out的动作,子sprite也是要一样执行fade out这个动作的,但是实际运行结果是,只有父sprite执行了这个动作,子sprite并没有执行。

那么这个问题如何解决呢? --- 一个最笨的方法就是 去getChildren() 然后每一个子sprite再去执行这个动作。

那么,还有其他方法吗?

--有的。我们可以用 setCascadeOpacityEnabled 这个方法。

在 CCRGBAProtocol 类定义了这个方法:

[cpp] view plaincopy

01./**

02. * whether or not opacity should be propagated to its children.

03. */

04. virtual bool isCascadeOpacityEnabled(void) = 0;

05. virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled) = 0;

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

再具体看看:

[cpp] view plaincopy

01.void CCNodeRGBA::setCascadeOpacityEnabled(bool cascadeOpacityEnabled)

02.{

03. _cascadeOpacityEnabled = cascadeOpacityEnabled;

04.}

[cpp] view plaincopy

01.virtual void updateDisplayedOpacity(GLubyte opacity) = 0;

[cpp] view plaincopy

01.void CCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity)

02.{

03. _displayedOpacity = _realOpacity * parentOpacity/255.0;

04.

05. if (_cascadeOpacityEnabled)

06. {

07. CCObject* pObj;

08. CCARRAY_FOREACH(m_pChildren, pObj)

09. {

10. CCRGBAProtocol* item = dynamic_cast<CCRGBAProtocol*>(pObj);

11. if (item)

12. {

13. item->updateDisplayedOpacity(_displayedOpacity);

14. }

15. }

16. }

17.}

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

[cpp] view plaincopy

01./**

02. * whether or not color should be propagated to its children.

03. */

04. virtual bool isCascadeColorEnabled(void) = 0;

05. virtual void setCascadeColorEnabled(bool cascadeColorEnabled) = 0;

显然就是为了在父sprite执行颜色变化的时候,子sprite也可以执行到这个变化。

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

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

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

[cpp] view plaincopy

01.SelectedBoxSprite* SelectedBoxSprite::createWithPic(const char *name)

02.{

03. SelectedBoxSprite* pobView = new SelectedBoxSprite();

04. if (pobView && pobView->initWithFile(name) && pobView->setUpdateView()) {

05. pobView->autorelease();

06. return pobView;

07. }

08. CC_SAFE_DELETE(pobView);

09. return NULL;

10.}

11.

12.bool SelectedBoxSprite::setUpdateView()

13.{

14. bool isRet = false;

15. do {

16. this->setCascadeOpacityEnabled(true);

17.

18. CCSprite* spr1 = CCSprite::create("yellow.png");

19. spr1->setAnchorPoint(CCPointZero);

20. spr1->setTag(1);

21. spr1->setPosition(ccp(0, 4));

22. this->addChild(spr1);

23.

24. listSpriteArray->addObject(spr1);

25.

26. CCSprite* spr2 = CCSprite::create("yellow_1.png");

27. spr2->setAnchorPoint(CCPointZero);

28. spr2->setTag(2);

29. spr2->setPosition(ccp(0, 30));

30. this->addChild(spr2);

31.

32. listSpriteArray->addObject(spr2);

33.

34. isRet = true;

35. } while (0);

36. return isRet;

37.}

我创建了这样的一个实例,想要执行CCFadeIn这个动作

[cpp] view plaincopy

01.SelectedBoxSprite* selectBoxSprite = SelectedBoxSprite::createWithPic("list_box.png");

02. selectBoxSprite->setAnchorPoint(ccp(0.5, 0.5));

03. selectBoxSprite->setPosition(ccp(300, 305));

04. selectBoxSprite->setTag(2);

05. this->addChild(selectBoxSprite,1);

06.

07. CCFadeIn* fadein = CCFadeIn::create(1);

08. selectBoxSprite->runAction(fadein);

但是,发现有问题,就是这个自定义sprite里面的两个子sprite不会执行这个fade in动作。奋斗

那么这么办呢?

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

[cpp] view plaincopy

01.CCFadeOut* fadeout = CCFadeOut::create(1);

02.selectBoxSprite->runAction(fadeout);

发现没有问题,这个自定义的sprite会fade out;

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

[cpp] view plaincopy

01.CCFadeTo* fadeto = CCFadeTo::create(1, 0);

02.selectBoxSprite->runAction(fadeto);

这个时候,我冷静下来看看代码,发现原来 在fade in之前没有 将这个精灵的opacity设置为 0

[cpp] view plaincopy

01.//这个很重要,不要忘了

02. selectBoxSprite->setOpacity(0);

03.

04. CCFadeIn* fadein = CCFadeIn::create(1);

05. selectBoxSprite->runAction(fadein);

这样发现运行就正常了,里面的两个子sprite也会运行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x c++
相关文章推荐