【问题标题】:How to restore spriteframes packed by texture packer如何恢复纹理打包器打包的精灵帧
【发布时间】:2013-08-19 14:29:22
【问题描述】:

我从一个 iOS 游戏中获得了一些图像资源(一个 png 文件和一个 plist 文件)。资源由纹理打包器打包。我想将 .png 和 .plist 文件恢复为 png 图像,但我不知道该怎么做。

【问题讨论】:

  • 您是从已发布的应用程序中获取它们的吗?在这种情况下,请注意这些资产受版权保护。充其量您可以将它们用作内部工作的占位符。如果您从其他地方获得它们,最好和最简单的方法是从作者那里获取原始文件。

标签: cocos2d-iphone texturepacker


【解决方案1】:

我刚刚写了一个小cocos2d 项目只是为了实现这一点。您基本上使用CCSpriteFrameCache 来加载plist 信息,然后遍历每个spriteFrame 以使用CCRenderTexture“剪切”所需的图集。主要逻辑是这样的-

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {

        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:PLIST_FILE];

        NSDictionary *frames = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrames];

        for(id key in frames) {
            //NSLog(@"key=%@ value=%@", key, [frames objectForKey:key]);
            [self saveSpriteToFile:key inFolder:FOLDER_PATH];
        }

    }
    return self;
}

-(void) saveSpriteToFile:(NSString *)name inFolder:(NSString *) folder {
    CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:name];
    CGSize spriteSize = [sprite contentSize];
    float scale = 1;
    int nWidth = spriteSize.width;
    int nHeight = spriteSize.height;
    nWidth *= scale;
    nHeight *= scale;
    [sprite setPosition:ccp(spriteSize.width / 2, spriteSize.height / 2)];
    [sprite setScale:scale];
    [self addChild:sprite];

    CCRenderTexture* render = [CCRenderTexture renderTextureWithWidth:sprite.contentSize.width height:sprite.contentSize.height];
    [render begin];
    [sprite visit];
    [render end];
    //NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //NSString *documentsDirectory = [paths objectAtIndex:0];
    [render saveToFile:[NSString stringWithFormat:@"%@/%@", folder, name] format:kCCImageFormatPNG];

    [self removeChild:sprite cleanup:YES];
}

以防万一其他人发现它有用,我刚刚将整个项目上传到 github。-

https://github.com/zuinqstudio/atlasSplitter

希望对你有帮助。

【讨论】:

  • 虽然这不会是 1:1 像素和颜色精确的提取。稍微改变颜色可能会出现错误,如果您不关闭纹理过滤(我在此代码示例中没有看到),则纹理将被过滤图像(即应用了平滑过滤器的图像) .并且渲染纹理有一个奇怪的 1 像素偏移错误 - 不确定何时发生或是否已修复。
猜你喜欢
  • 2015-05-10
  • 2014-07-03
  • 1970-01-01
  • 2011-08-13
  • 2017-05-16
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多