Как я могу создать лист спрайтов в Xcode без Cocos2d?

Я разрабатываю простое приложение, которое анимирует изображение, когда пользователь перемещает слайдер. Это можно легко сделать с помощью отдельных изображений, но по очевидным причинам этот метод неэффективен.

В настоящее время у меня есть анимация, разбитая на 14 листов спрайтов с 16 изображениями на листе. Я создал метод, который использует CGImageCreateWithImageInRect, чтобы найти текущее изображение, продиктованное слайдером, и обновить изображение с этим изображением. Это работает, но не плавно. Кажется, я понимаю, почему, но я не знаю, что делать иначе. Хотя я мог использовать Cocos2d или OpenGL ES, я упрям ​​и убежден, что это возможно без них. Я просто хочу знать, как это сделать.

Вот пример кода:

- (void)setUp{ NSString *string; NSString *bundleString = [[NSBundle mainBundle] bundlePath]; dsRedPathArray = [[NSMutableArray alloc] initWithCapacity:15]; for (int i = 0; i < 14; i++) { string = [bundleString stringByAppendingFormat:@"/dsRedAni_%d.png", i]; [dsRedPathArray addObject:string]; } //initial image starts at (0, 1) of image dsRedAni_9 currentImage = [UIImage imageWithContentsOfFile:[dsRedPathArray objectAtIndex:9]]; currentRef = CGImageCreateWithImageInRect(currentImage.CGImage, CGRectMake(495, 0, kModelWidth, kModelHeight)); modelView.image = [UIImage imageWithCGImage:currentRef]; } - (IBAction)sliderMoved:(UISlider*)sender { [self animateModel:sender.value]; } - (void)animateModel:(int)index { index += 1; imageIndex = (index / 16) + 9; if (imageIndex > 13) { imageIndex = -14 + imageIndex; } currentX = kModelWidth * (index % 4); currentY = kModelHeight * ((index / 4) % 4); currentRect = CGRectMake(currentX, currentY, kModelWidth, kModelHeight); currentImage = [UIImage imageWithContentsOfFile:[dsRedPathArray objectAtIndex: (imageIndex)]]; currentRef = CGImageCreateWithImageInRect(currentImage.CGImage, currentRect); modelView.image = [UIImage imageWithCGImage:currentRef]; } 

Заранее благодарю за любую помощь.

Наконец, я нашел довольно быстрый и эффективный, хотя и нетрадиционный способ циклического перехода через каждый раздел моих спрайтов без какой-либо внешней помощи API. Вместо того, чтобы тратить время и силы на резкое изображение в контексты или отдельные файлы, я обнаружил, что для меня было более эффективным создание UIView в размере необходимого мне изображения, а затем добавление всего листа спрайтов в представление как UIImageView ,

Если для view.clipsToBounds установлено значение YES, представление действует как маска для моего листа спрайтов, ограничивая видимую часть размером каждого изображения, которое я хочу прокрутить на листе. Чтобы дать эффект анимации, я просто использую imageview.center, чтобы переместить лист спрайта вокруг представления в нужные координаты изображения. Итак, в справочном листе с 16 изображениями мне нужно сделать только один вызов, чтобы показать изображение, а затем переместить его на каждый кадр в анимации.

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setUp]; self.backgroundColor = [UIColor clearColor]; self.clipsToBounds = YES; } return self; } - (void)setUp { //assign |lastImageIndex| a number not equal to |imageIndex| lastImageIndex = -1; modelImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1924, 1708)]; NSString *string; NSString *bundleString = [[NSBundle mainBundle] bundlePath]; UIImage *image; if (!imageArray) { imageArray = [[NSMutableArray alloc] init]; NSLog(@"Init egfp |imageArray|"); } for (int i = 0; i < 10; i++) { string = [bundleString stringByAppendingFormat:@"/moleculeAni_%d.png", i]; image = [UIImage imageWithContentsOfFile:string]; [imageArray addObject:image]; if (i == 9) { NSLog(@"Filled egfp |imageCache|"); } } [self addSubview:modelImageView]; } - (void)animateModel:(int)index { if (index != 1) { index -= 1; } imageIndex = (index / 16); if (imageIndex < 9) { currentX = 962 - (481 * (index % 4)); currentY = 854 - (427 * ((index / 4) % 4)); } else { currentX = 962 - (481 * (index % 4)); currentY = 427 - (427 * ((index / 4) % 4)); } if (imageIndex != lastImageIndex) { if (imageIndex < 9 && onLastFrame) { modelImageView.frame = CGRectMake(0, 0, 1924, 1708); onLastFrame = NO; } else if (imageIndex == 9 && !onLastFrame) { modelImageView.frame = CGRectMake(0, 0, 1924, 854); onLastFrame = YES; } NSLog(@"Image: %d", imageIndex); tempImage = [imageArray objectAtIndex:imageIndex]; modelImageView.image = tempImage; } modelImageView.center = CGPointMake(currentX, currentY); lastImageIndex = imageIndex; } 

Большая часть кода здесь тратится на определение того, где изображение должно перемещаться, чтобы отобразить правильное изображение. Это принимает метод, который я объяснил выше, и распространяет его на 10 листов спрайтов, каждый из которых имеет 16 изображений, равномерно распределенных (кроме последнего, который имеет 8). Единственное замедление произошло, когда программа переключалась между изображениями каждый 16-й кадр. Чтобы обойти это, мой контроллер имеет вид, который быстро просматривает все изображения под другим видом (например, занавес), поэтому пользователь только подключен к экрану загрузки. После того, как изображения были задействованы, вид занавеса удаляется, и анимация (контролируемая пользователем с помощью ползунка) перемещается, как масло.

Один из способов сделать это – разрезать изображения с помощью CGImageCreateWithImageInRect, как вы начали выше. Затем добавьте их в массив:

 myArray addObject:[UIImage imageWithCGImage:currentRef]; 

Затем используйте UIImageView с setAnimationImages, например:

 UIImageView *myAnimationImageView; [myAnimationImageView setAnimationImages:myArray]; 

Затем вы можете запустить анимацию.

Здесь есть хороший проект: https://github.com/r3econ/UIImage-Sprite-Additions

  • iOS: модель-архитектура в приложениях
  • Возможно ли локализовать имя приложения iOS только на основе региона?
  • Приложение iOS работает в фоновом режиме по умолчанию
  • как я могу программно изменить rootViewController с помощью раскадровки?
  • iPad Запуск изображения в альбомной ориентации, повернутой на 90 градусов против часовой стрелки
  • Не удалось получить addIssueWithName: работа в NKLibrary
  • Просмотр обновлений автоопределения после его отображения
  • Раскройте экранную раскладку с центрированным изображением iOS
  • Имитация заголовка в Xcode
  • iOS: создание лайтбокса NavigationController на iPad
  • Ошибка Xcode при экспорте проекта для локализации
  • Interesting Posts

    Связывание MBProgressHUD с моим проектом

    iOS – поддержка iPad и iPhone без использования наконечника

    IQKeyboardManager – Сдвиг UITextView слишком далеко

    iPhone: регулярное прослушивание GPS и разрядка аккумулятора

    Решение подхода к двум сеттерам, влияющим друг на друга

    Ошибка {NSLocalizedDescription = Не удается подключиться к iTunes Store} при тестировании IAP на iOS Simulator

    Упаковка статических библиотек iOS вместе в командной строке

    Прокрутите до стола Просмотр Верх заголовка

    Проблема с CoreAnimation с ARC

    Использование моста rct в приложении iOS для представления вида таблицы в реакции native

    Как изменить заголовок Swift («ProductModuleName-Swift.h») Название продукта как имя продукта изменяется динамически

    UnityEditor.BuildPlayerWindow + BuildMethodException: при создании проекта Unity для iOS

    на ios7, <input type = date> не отображается в webview без значения по умолчанию

    Линия не является гладкой на слое. При повороте

    UIView alpha 0, но все равно получать события касания?

    Давайте будем гением компьютера.