如何在cocos2d-x中将CCSprite转换为UIImage?

如何在cocos2d-x中将CCSprite转换为UIImage?,cocos2d-x,Cocos2d X,我知道在cocos2d中,有一种简单的方法可以通过使用 [UIImage imageWithData:[renderer getUIImageAsDataFromBuffer:kCCImageFormatPNG]]。 但是,在cocos2d-x中,CCRender没有像getUIImageAsDataFromBuffer这样的API来进行转换。我想知道是否有任何可能的方法将CCSprite转换为cocos2d-x下的UIImage?CCSprite包含CCTexture2D(可通过getText

我知道在cocos2d中,有一种简单的方法可以通过使用 [UIImage imageWithData:[renderer getUIImageAsDataFromBuffer:kCCImageFormatPNG]]。
但是,在cocos2d-x中,CCRender没有像getUIImageAsDataFromBuffer这样的API来进行转换。我想知道是否有任何可能的方法将CCSprite转换为cocos2d-x下的UIImage?

CCSprite包含CCTexture2D(可通过
getTexture()
访问),尝试使用它。如果没有更好的方法,您也可以将纹理放到
CCImage
,并使用
CCImage::saveToFile()

以下是我用来从
CCImage
转到
UIImage
UIImage
类别:

#import "UIImage+Conversions.h"

@implementation UIImage (Conversions)

+ (UIImage *) imageFromCCImage:(cocos2d::CCImage *) ccImage {
    NSUInteger bytesPerPixel = 4;
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
                                                              ccImage->getData(),
                                                              ccImage->getDataLen() * bytesPerPixel,
                                                              NULL);

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    NSUInteger scanWidth = ccImage->getWidth() * bytesPerPixel;
    CGImageRef imageRef = CGImageCreate(ccImage->getWidth(),
                                        ccImage->getHeight(),
                                        8,
                                        bytesPerPixel * 8,
                                        scanWidth,
                                        colorSpaceRef,
                                        bitmapInfo,
                                        provider,
                                        NULL,
                                        NO,
                                        renderingIntent);

    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGColorSpaceRelease(colorSpaceRef);
    CGImageRelease(imageRef);

    return image;
}

@end

UIImageView中有一个名为
loadTexture()
的方法,该方法获取文件路径并将文件路径转换为图像,然后将其加载到UIImageView。但这不是必需的方法,所以我们需要实现新的方法,它将采用CCNode,我在这里使用CCNode可以添加CCNode的任何子级,包括CCSprite

void ImageView::addNode(CCNode* node){
    if (!node)
    {
        CCLOG("node is null");
        return;
    }

    CCNode::removeChild(_imageRenderer);
    _imageRenderer = NULL;
    _textureFile = "";
    _imageTexType = UI_TEX_TYPE_PLIST;
    _imageRenderer = node;
    CCNode::addChild(_imageRenderer, IMAGE_RENDERER_Z, -1);
    _imageTextureSize = _imageRenderer->getContentSize();
    imageTextureScaleChangedWithSize();
    updateAnchorPoint();
    updateFlippedY();
    updateRGBAToRenderer(_imageRenderer);
    _imageRenderer->setPosition(getPosition());
}
此方法删除并取消_imageRenderer属性,该属性是用于在其上添加要显示的图像的CCNode。考虑到您需要在头文件中添加方法。

您可以这样做:

CCRenderTextureEx* texture = CCRenderTextureEx::create(size.width, size.height);
texture->setPosition(ccp(size.width * 0.5f, size.height * 0.5f));
texture->begin();
sprite->visit();
texture->end();
texture->saveToFile(path->getCString(), kCCImageFormatPNG);
texture->saveImage();
并使用此自定义类:

您可以在UIImage中生成CCSprite