iPhone: Создание игр для iOS (iPhone и iPad)
GameDev.ru / Сообщества / iPhone / Форум / Помогите разобраться в одном моменте SpriteHelper-a

Помогите разобраться в одном моменте SpriteHelper-a

NuclominusПостоялецwww2 мая 201222:24#0
Вообщем, вопрос направлен на тех кто использует эту утилиту.
Я столкнулся с ситуацией, что, мне надо сделать множество разных анимаций. Но хранить несколько паков со спрайтами мне не в выгоду. Можно ли сделать один пак со всеми спрайтами, при этом все анимации, прописанные в плистах, обращались к одному источнику?
digПостоялецwww2 мая 201222:43#1
Не очень понял вопрос, наверное можно, разве что-то мешает?
CasDevПостоялецwww3 мая 20122:59#2
CCSpriteFrameCache просто хранит ссылки каждого фрейма на текстурный атлас и алиас самого фрейма.

Поэтому ты делаешь один пак спрайтов - сам атлас (.png) и список spriteFrame'ов (.plist).

Далее - анимации. Я к примеру их тоже храню в .plist'е вида
<key>Имя анимации</key>
<dict>
  // тут - delay / циферка - время анимации каждого кадра
  // prefix - префикс для каждого фрейма, то есть ("rabbit_idle_")
  // frames - обычно номера фреймов в строке - типа "0,1,2,..." - если в анимации много одинаковых фреймов - только в путь помогает, в крайнем случае префикс оставляешь пустым и пихаешь сюда полные имена фреймов.
<dict>

Загрузка посредством класса (я пользуюсь ARC, поэтому retain/release/autorelease в коде нету):

@implementation AnimationsData
{
  NSMutableDictionary *  animationsData_;
}


#pragma mark - Constructor

- (id)init
{
  if (self = [super init])
  {
    animationsData_ = [NSMutableDictionary dictionary];
  }
  return self;
}


#pragma mark - Functional

- (CCAnimation *)animationByAlias:(NSString *)alias;
{
  return ((CCAnimation *)([animationsData_ objectForKey:alias]));
}

- (void)loadFromPath:(NSString *)path
{
  SGAssert(!([[NSFileManager defaultManager] fileExistsAtPath:path]), @"Can't find animations file: %@", path)
  
  NSDictionary * const data = [NSDictionary dictionaryWithContentsOfFile:path];
  SGAssert(!((data) && ([data count])), @"An empty dictonary for animations data was found by path: %@", path)
  
  CCSpriteFrameCache * spriteFrameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
  
    NSArray * const allKeys = [data allKeys];
  for (NSString * alias in allKeys)
  {
    NSDictionary * const animatonData = [data objectForKey:alias];
    
    NSString * const framesValue = [animatonData objectForKey:kCommon_Frames];
    SGAssert(!framesValue, @"Can't found [%@] for animation alias [%@] by file: %@", kCommon_Frames, alias, path)
    
    NSArray * const frameSuffixes = [framesValue componentsSeparatedByString:@","];
    
    NSString * const prefix = [animatonData objectForKey:kCommon_Prefix];
    NSString * const delayValue = [animatonData objectForKey:kCommon_Delay];
    
    const float delay = (delayValue) ? [delayValue floatValue] : kCommon_FrameRate;
  
    NSMutableArray * frames = [NSMutableArray arrayWithCapacity:[frameSuffixes count]];
    for (NSString * const frameSuffix in frameSuffixes)
    {
      NSString * const frameAlias = [NSString stringWithFormat:kCommon_FormatPngExtension, [NSString stringWithFormat:@"%@%@", prefix, frameSuffix]];
      [frames addObject:[spriteFrameCache spriteFrameByName:frameAlias]];
    }
    
    CCAnimation * animation = [CCAnimation animationWithFrames:frames
                               delay:delay];
    
    [animationsData_ setObject:animation
              forKey:alias];
  }
}
Константы - имена ключей для .plist'а (не имею привычки хардкодить значения в коде - обжигался на неверных закорючках не раз, выношу в костанты через OBJC_EXTERN).

Перед использованием класса (загрузкой через функцию loadFromPath) все используемые CCSpriteFrame должны быть загружены в CCSpriteFrameCache, разумеется!

NuclominusПостоялецwww3 мая 201213:11#3
спасибо большое)

/ Форум / iPhone: Создание игр / Программирование

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр