Экспорт таблицы спрайтов для cocos2d

Я хотел бы знать, как люди обычно сохраняют анимации, чтобы легко загружать их в Cocos2d с минимальным количеством жесткого кода.

НАПРИМЕР. Решение, о котором я подумал, состоит в том, чтобы иметь один файл plist, содержащий информацию о каждом кадре, а второй plist - информацию о каждой анимации (имя анимации, какие кадры воспроизводить и, возможно, задержку).

Если это правильное решение, как я могу автоматически генерировать такие файлы plist для таблицы спрайтов?


person Terko    schedule 06.04.2013    source источник


Ответы (1)


Вы можете использовать инструмент для упаковки текстур, чтобы создать атлас спрайтов и соответствующий plist. Zwoptex работает очень хорошо для меня. Когда у вас есть png и plist, вы можете загрузить их с помощью SpriteFrameCache

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"gameSprites.plist"];

Кроме того, вы можете использовать соглашение об именах для кадров анимации, например, добавляя к ним суффикс «_index»: animFrame_1, animFrame_2 и т. д.

Затем у вас может быть категория CCAnimation с помощниками для загрузки анимации с заданным именем анимации и количеством кадров. Вы можете взять следующий код в качестве примера.-

+ (CCAnimation *) animationWithFrame:(NSString *) frame frameCount:(int) frameCount startIndex:(int) startIndex delay:(float) delay separator:(NSString *) separator {
    // load the ship's animation frames as textures and create a sprite frame
    NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];
    CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];

    int end = frameCount + startIndex;
    for (int i = startIndex; i < end; i++)
    {
        NSString* file = [NSString stringWithFormat:@"%@%@%i.png", frame, separator, i];
        CCSpriteFrame* frame = [frameCache spriteFrameByName:file];
        [frames addObject:frame];
    }
    // Return an animation object from all the sprite animation frames
    return [CCAnimation animationWithFrames:frames delay:delay];
}

Надеюсь, поможет.

person ssantos    schedule 06.04.2013
comment
и где я могу получить frameCount для определенной анимации? Я думаю, что жесткое кодирование будет неэффективным, когда у меня много анимаций. Было бы намного лучше читать эту информацию из .plist в. Может, например. Zwoptex хранит где-то информацию о количестве кадров для определенных анимаций? возможно, сгенерировать вторичный plist или какое-то другое решение? - person Terko; 07.04.2013
comment
Вы правы, но, к сожалению, Zwoptex не позволяет вам добавлять такие метаданные, у меня обычно есть набор констант/перечислений, чтобы сохранить количество кадров анимации. LevelHelper имеет больший контроль над информацией об анимациях, но если вам это нужно только для управления количеством кадров анимации, это, вероятно, не стоит. В этом случае было бы быстрее написать собственное число кадров анимации сопоставления plist. - person ssantos; 07.04.2013