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也会运行了。
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 Sprite 执行 CCFade~ 这类透明度变化动作的一些问题
- Cocos2d-x Sprite 执行 CCFade~ 这类透明度变化动作的一些问题
- Cocos2d-x Sprite 执行 CCFade~ 这类透明度变化动作的一些有关问题
- Cocos2d-x Sprite 执行 CCFade~ 这类透明度变化动作的一些有关问题
- Cocos2d-x Sprite 执行 CCFade~ 这类透明度变化动作的一些问题
- cocos2d-x问题记录:只在回调函数中执行动作会导致终端
- cocos2d-x win32移植安卓遇到的一些问题
- cocos2d-x细节之自绘图形透明度问题
- 在MATLAB7.0中编译与发布可执行文件的详细步骤与一些问题解答
- cocos2d sprite执行完动作之后调用回调自行销毁
- 关于cocos2d-x的新人求职的一些问题
- cocos2d sprite执行完动作之后调用回调自行销毁
- Cocos2d的字体生成软件Hiero v2.0 - Bitmap Font Tool的一些问题
- 火狐不执行js的一些解决办法及火狐对js的兼容问题
- cocos2d-x visual assist box2d.h 的一些问题
- cocos2d-x常用 及新版本的一些变化
- Cocos2d的字体生成软件Hiero v2.0 - Bitmap Font Tool的一些问题
- 在web页面上放了一些服务器按钮,在各个按钮的单击事件中都有代码!可不知道哪里出问题了,怎么操作都不能触发这些事件,好象代码一点都不执行!根本没办法调试!请高手指点一二!谢谢!
- 火狐不执行js的一些解决办法及火狐对js的兼容问题
- 关于cocos2d框架的一些问题如下<转载资料有兴趣可以围观>