cocos2d精灵帧缓存无法更改

时间:2012-01-28 07:47:18

标签: iphone ios cocos2d-iphone

在我的游戏中我想制作几个主题。 (像涂鸦跳) 框架名称在不同的主题中是相同的,我想我只需要更改plist文件。

Helper.m中的

+(void) addCache {

ThemeTypes themeType = [Helper getCurrentThemeType];

if (themeType == ThemeTypeDefaultTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"block.plist"];
}
else if (themeType == ThemeTypeJungleTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"jungle1.plist"];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"jungle2.plist"];
}
else if (themeType == ThemeTypeXmasTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"xmas1.plist"];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"xmas2.plist"];
}
else if (themeType == ThemeTypeWhiteTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"blockwhite.plist"];
}
else if (themeType == ThemeTypeOuterSpaceTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"outer1.plist"];
}
else if (themeType == ThemeTypeSkyTheme) {
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sky1.plist"];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sky2.plist"];
}
else {

}
}


+(void) purgeCache {
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
    [CCSpriteFrameCache purgeSharedSpriteFrameCache];
}

+(void) refreshCache {
    [Helper purgeCache];
    [Helper addCache];
}
在appdelegate中,我将调用'addcache',然后在我的ShopScene中,当选择主题时,'刷新缓存'将被调用。

这段代码在我的BlockCache中('普通块'是游戏中的一种块')

    CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"normal.png"];
    batch = [CCSpriteBatchNode batchNodeWithTexture:frame.texture];
    [self addChild:batch];

(注意每个plist文件中都存在@“normal.png”。使用相同的名称。

但在更改主题后,“块缓存”仍然使用原始图像。但是,后台等使用正确的(我使用bg = [CCSprite spriteWithSpriteFrameName:]方法

更新:选择主题后,我杀了游戏,然后重新启动它,它工作正常。这意味着来自Appdelegate的调用很好,但我无法在运行时更改缓存。

1 个答案:

答案 0 :(得分:1)

精灵帧参考纹理。纹理缓存在CCTextureCache中。您可能还需要从CCTextureCache中删除纹理。

如果您仍然在屏幕上使用纹理A但您希望它们使用纹理B的精灵,您可以选择以下选项:

  • 将带有新纹理的setTexture:消息发送到每个sprite
  • 删除旧精灵并添加新精灵
  • 重新加载当前场景

请注意,在任何情况下调用[CCSpriteFrameCache purgeSharedSpriteFrameCache];都是多余的。您不需要释放单例,只需清除缓存的任何内容。

您可以找到纹理卸载的工作解决方案,并替换sprite在我Cocos2D Webcam Viewer tutorial的代码中使用的纹理。