Кэш-кадр спрайта cocos2d не может измениться - PullRequest
1 голос
/ 28 января 2012

в моей игре я хочу сделать несколько тем. (как каракули прыжок) имена рамок в разных темах одинаковы, и я думаю, что мне просто нужно изменить файлы plist.

в Хелпер м .:

+(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];

(обратите внимание, что @ "normal.png" существует в каждом файле plist. Используйте то же имя.

но после смены темы «кеш блоков» по-прежнему использует исходные изображения. однако фон и т. д. используют правильный (я использую bg = [CCSprite spriteWithSpriteFrameName:] метод

ОБНОВЛЕНИЕ: после выбора темы я убиваю игру, а затем перезапускаю, она работает нормально. это означает, что вызов из Appdelegate в порядке, но я не могу изменить кэш во время выполнения.

1 Ответ

1 голос
/ 28 января 2012

Sprite кадры справочных текстур.Текстуры кэшируются в CCTextureCache.Вам, вероятно, также необходимо удалить текстуры из CCTextureCache.

И если на экране все еще есть спрайты, использующие текстуру A, но вы хотите, чтобы они использовали текстуру B, у вас есть следующие варианты:

  • отправить сообщение setTexture: с новой текстурой каждому спрайту
  • удалить старые спрайты и добавить новые
  • перезагрузить текущую сцену

Обратите внимание, что в любом случае вызов [CCSpriteFrameCache purgeSharedSpriteFrameCache]; является излишним.Вам не нужно освобождать синглтон, просто очистите все, что он кэширует.

Вы можете найти рабочее решение для выгрузки текстуры и замены текстуры, которую использует спрайт в коде для моей Cocos2D Webcam Viewerучебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...