SKTextureAtlas: сбивает с толку более одного атласа

У меня проблема при использовании более одного атласа.

Например, у меня есть main_menu.atlas и game.atlas с изображениями для этих сцен. Прежде чем появится сцена главного меню, я подготавливаю для нее атлас ( [SKTextureAtlas atlasNamed:@"main_menu"] ), и все работает нормально. Но после того, как я запустил игру, а также подготовил игровой атлас ( [SKTextureAtlas atlasNamed:@"game"] ), в игре я вижу только пустые узлы (прямоугольники с красным крестиком). Никаких исключений или предупреждений - все в порядке.

И когда я переместил все игровые активы в main_menu.atlas и удалил game.atlas, все работает нормально - я вижу спрайты в игре. Но я хочу разделить атласы для оптимизации производительности.

Я использую свой собственный помощник для управления текстурами SpriteKit. Он загружает атласы и возвращает текстуры, которые мне нужны. Итак, у меня есть эти методы:


- (void) loadTexturesWithName:(NSString*)name {
    name = [[self currentDeviceString] stringByAppendingString:[NSString stringWithFormat:@"_%@", name]];
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:name];
    [self.dictAtlases setObject:atlas forKey:name];
}

- (SKTexture *) textureWithName:(NSString*)string {
    string = [string stringByAppendingString:@".png"];

    SKTexture *texture;
    SKTextureAtlas *atlas;
    for (NSString *key in self.dictAtlases) {
        atlas = [self.dictAtlases objectForKey:key];
        texture = [atlas textureNamed:string];
        if(texture) {
            return texture;
        }
    }
    return nil; // never returns "nil" in my cases
}

"Чистый" не помогает. Что я делаю не так? Заранее спасибо.


person Igor Shaulov    schedule 21.01.2014    source источник
comment
Я почти уверен, что у вас может быть только один атлас текстур, а для набора спрайтов он обычно создается динамически: .html" rel="nofollow noreferrer">developer.apple.com/library/ios/recipes/   -  person GuybrushThreepwood    schedule 21.01.2014
comment
Спасибо. Но, например, если у меня есть два спрайта, которые должны присутствовать в одной сцене, но первый хранится в ~iphone.1.png, а второй — в ~iphone.2.png (другой лист спрайтов), оба этих листа спрайтов должны быть в памяти и число вызовов отрисовки увеличилось бы? Я думаю, было бы лучше, если бы оба спрайта были на одном листе спрайтов, но метод, представленный по вашей ссылке, этого не гарантирует.   -  person Igor Shaulov    schedule 21.01.2014
comment
Я не думаю, что у вас есть какой-либо выбор - хотя он найдет спрайт без проблем. Способ приблизиться к этому — поместить все ваши отдельные спрайты в ваш проект, как указано в ссылке, и позволить SpriteKit построить атлас. Насколько я понимаю, Sprite Kit не предназначен для использования с предустановленным атласом. Если вам это нужно, вы можете взглянуть на решение Cocos2d или OpenGLES.   -  person GuybrushThreepwood    schedule 21.01.2014


Ответы (1)


Позвольте мне начать с заявления: вы определенно можете использовать 2+ атласа текстур :)

Теперь выдать на руки:

Сначала вы загружаете атлас меню (сначала в dict), а затем игровой атлас. Когда вы берете текстуры меню, все в порядке. Когда вы идете за текстурой игры, вы сначала смотрите в атлас меню (изображение недоступно, поэтому атлас возвращает текстуру-заполнитель, определенную в этом doc не равен нулю, как вы ожидаете.

Этот код должен работать по желанию

- (SKTexture *) textureWithName:(NSString*)string {
    string = [string stringByAppendingString:@".png"];

    SKTexture *texture;
    SKTextureAtlas *atlas;
    for (NSString *key in self.dictAtlases) {
        atlas = [self.dictAtlases objectForKey:key];
        if([[atlas textureNames] containsObject:string]){
            texture = [atlas textureNamed:string];
            return texture;
        }
    }
    return nil;
}

Кроме того, он будет отлично работать без добавления .png :)

person Dobroćudni Tapir    schedule 23.01.2014