Search code examples
cocos2d-iphoneuiimageccsprite

How to Convert CCSpriteBatchNode to UIImage?


I want to convert CCSpriteBatchNode to a UIImage, is there a possible way to do it? I know it is possible to convert CCSprite to UIImage, but when I try it with CCSpriteBatchNode, it crashes :

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'CCSpriteBatchNode should NOT be root node'

Thanks!

Here is the code to convert CCSprite to UIImage.

+ (UIImage *)renderUIImageFromSprite:(CCSprite *)sprite {
    CCRenderTexture *renderer = [CCRenderTexture renderTextureWithWidth:sprite.contentSize.width; height:sprite.contentSize.height;];
    [renderer begin];
    [sprite visit];
    [renderer end];
    return [renderer getUIImageFromBuffer];
}

EDIT : This is the working code.

+ (UIImage *)renderUIImageFromCCLabelBMFont:(CCLabelBMFont *)bmfont {
    GLProgram *program = [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionTextureColor];
    glUseProgram(program->program_);

    int textureWidth = bmfont.contentSize.width;
    int textureHeight = bmfont.contentSize.height;

    CCRenderTexture *renderer = [CCRenderTexture renderTextureWithWidth:textureWidth height:textureHeight];
    bmfont.anchorPoint = ccp(0.0, 0.0);

    CCNode *node = [CCNode node];
    [node addChild:bmfont];

    [renderer begin];
    [node visit];
    [renderer end];

    return [renderer getUIImageFromBuffer];
}

Solution

  • Needed this myself. This is ARC code and set up as a category for CCLabelBMFont.

    CCLabelBMFont+UIImage.h

    @interface CCLabelBMFont (UIImage)
    
    - (UIImage *)image;
    
    @end
    

    CCLabelBMFont+UIImage.m

    @implementation CCLabelBMFont (UIImage)
    
    - (UIImage *)image
    {
        CCGLProgram *program = [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionTextureColor];
        glUseProgram(program->program_);
    
        CCRenderTexture *renderer = [[CCRenderTexture alloc] initWithWidth:(int)self.contentSize.width
                                                                    height:(int)self.contentSize.height
                                                               pixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    
        CCLabelBMFont *labelBMFont = [[CCLabelBMFont alloc] initWithString:string_
                                                                   fntFile:fntFile_
                                                                     width:width_
                                                                 alignment:alignment_
                                                               imageOffset:imageOffset_];
    
        labelBMFont.anchorPoint = ccp(0.0, 0.0);
    
        CCNode *node = [CCNode node];
        [node addChild:labelBMFont];
    
        [renderer begin];
        [node visit];
        [renderer end];
    
        return [renderer getUIImage];
    }
    
    @end