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];
}
Needed this myself. This is ARC code and set up as a category for CCLabelBMFont.
@interface CCLabelBMFont (UIImage)
- (UIImage *)image;
@end
@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