Search code examples
objective-cccsprite

CCSprite Fadeout with children


I'm using a CCSprite with a few other CCSprite objects added as children, the other animations I'm using (scale and rotate) work great and the children are animated too. But when I'm using CCFadeOut, it only fades the parent.

I've read that fadeout doesn't apply to the children. Is there any way other than iterating over every child and calling the fadeout on each of them?


Solution

  • This answer is rendered obsolete by Gregory Johnson Answer


    Well, I guess your choices are (Ranked from simplest to complex):

    1) Just go into the CCSprite class in cocos2d library, and hack it. (<3 open source). (not recommended).

    -(void) setOpacity:(GLubyte) anOpacity
    {
    opacity_ = anOpacity;
    
    // special opacity for premultiplied textures
    if( opacityModifyRGB_ )
        [self setColor: colorUnmodified_];
    
        [self updateColor];
    
        for (id<CCRGBAProtocol> child in children ) {
            // You should check if child responds to selector or conforms to CCRGBAProtocol.
            [child setOpacity:opacity];
        }
    }
    

    2) Same as the solution above, except subclass CCSprite to MyCCSprite, and inherit from it instead of CCSprite. Finally, override setOpacity: in the new class:

    - (void) setOpacity:(GLubyte)opacity
    {
        [super setOpacity:opacity];
        for(id<CCRGBAProtocol> child in children) {
            [child setOpacity:opacity];
        }
    }
    

    3) Run the CCFade action on the parent and the children by iterating them. (silly, if you ask me).

    IMPORTANT: Just please, please, please keep in mind that opacityis a property of the CCRGBAProtocol. Not all CCNode classes have it. So, make sure you keep that in mind.

    References:

    1. http://www.cocos2d-iphone.org/forum/topic/1252