Есть несколько вопросов SO, касающихся покадровой анимации (например, покадровая анимация и другие похожие вопросы), однако я чувствую, что мой отличается, так что вот.
Это частично вопрос дизайна от человека с очень небольшим опытом работы с ios.
Я не уверен, что «кадр за кадром» — это правильное описание того, что я хочу сделать, поэтому позвольте мне описать это. По сути, у меня есть «сценарий» анимационного фильма, и я хочу воспроизвести этот сценарий.
Этот сценарий представляет собой файл json, описывающий набор сцен. В каждой сцене есть несколько элементов, таких как фоновое изображение, список актеров с их позициями и фоновый звуковой клип. Кроме того, для каждого актера и фона есть файл изображения, который их представляет. (это немного сложнее - у каждого актера есть «поведение», например, как он моргает, как он говорит и т. д.). Поэтому моя работа состоит в том, чтобы следовать заданному сценарию, ссылаясь на актеров и фон, и в каждом кадре размещать актеров в назначенных им местах, рисовать правильный фон и воспроизводить звуковой файл.
Фильм может быть поставлен на паузу, прокручиваться вперед или назад, как и раньше. к функциям видеоплеера YouTube.
Большинство вопросов, которые я видел и которые относятся к покадровой анимации, имеют другие требования, чем мои (позже я перечислю еще некоторые требования). Обычно они предлагают использовать свойство animationImages объекта UIImageView. Это нормально для анимации кнопки или флажка, но все они предполагают наличие короткого и предопределенного набора изображений, которые необходимо воспроизвести.
Если бы я использовал анимациюImages, мне пришлось бы предварительно создать все изображения. фронт, и я чисто предполагаю, что он не будет масштабироваться (подумайте о 30 кадрах в секунду в течение одной минуты, вы получите 60 * 30 = 1800 изображений. Плюс возможности очистки и паузы/воспроизведения кажутся сложными в этом случае).
Поэтому я ищу правильный способ сделать это. Моя интуиция, и я все больше узнаю по ходу дела, заключается в том, что есть, вероятно, три или четыре основных способа добиться этого.
- Используя основные анимации и определяя «ключевые точки» и анимированные переходы ч/б этих ключевых точек. Например, если актеру нужно быть в точке А в момент времени t1 и в точке Б в момент времени t2, то все, что мне нужно сделать, это анимировать то, что находится между ними. Я делал что-то подобное в ActionScript в прошлом, и это было хорошо, но было особенно сложно реализовать действие очистки и синхронизировать все, поэтому я не большой поклонник этого подхода. Представьте, что вам нужно реализовать паузу в середине анимации или прокрутку до середины анимации. Это выполнимо, но не приятно.
- Установите таймер, скажем, 30 раз в секунду и на каждом тике сверяйтесь с моделью (модель представляет собой json-файл скрипта вместе с описанием актеров и фонов) и рисуйте то, что нужно нарисовать в это время. Используйте Quartz 2D API и drawRect. Это, вероятно, простой подход, но у меня недостаточно опыта, чтобы сказать, насколько хорошо он будет работать на разных устройствах, возможно, с точки зрения процессора, все зависит от количества вычислений, которые мне нужно сделать на каждом тике, и количества усилия, необходимые ios, чтобы нарисовать все. У меня нет предчувствия.
- Аналогичен варианту 2, но для рисования используется OpenGL. Я предпочитаю 2 b/c, API проще, но, возможно, больше подходит OpenGL с точки зрения ресурсов.
- Используйте игровой фреймворк, такой как cocos2d, которым я никогда раньше не пользовался, но который, похоже, решает больше или меньше подобных проблем. Кажется, у них хороший API, поэтому я был бы счастлив, если бы смог найти ответы на все свои требования.
Помимо требований, которые я только что описал (воспроизведение фильма с учетом его файла «сценария» и описания актеров, фонов и звуков), есть еще один набор требований —
- Фильм должен воспроизводиться в полноэкранном режиме или в режиме частичного экрана (где остальная часть экрана предназначена для других элементов управления)
- Я начинаю с iphone, естественно, за ним должен последовать ipad.
- Я хотел бы иметь возможность создать эскиз этого фильма для локального использования телефона (отобразить его в галерее в моем приложении). Миниатюра может быть просто первым кадром фильма.
- Я хочу иметь возможность «экспортировать» результат в виде фильма, что-то, что можно было бы легко загрузить на YouTube или Facebook.
Таким образом, большой вопрос здесь заключается в том, может ли какая-либо из предложенных 1-4 реализаций, которые я имею в виду (или другие, которые вы могли бы предложить), каким-либо образом экспортировать такой фильм.
Если все четыре не справятся с задачей экспорта фильма, у меня есть альтернатива. в уме. Альтернативой является использование сервера, на котором работает ffmpeg и который принимает пакет всех изображений фильмов (мне пришлось бы рисовать их в телефоне и загружать на сервер по их последовательности), а затем сервер компилировал бы все изображения. с их саундтреком к одному фильму.
Очевидно, что для простоты я бы предпочел сделать это без сервера, т.е. иметь возможность экспортировать фильм с iphone, но если это слишком много, то последнее требование будет по крайней мере, чтобы иметь возможность экспортировать набор всех изображений (ключевых кадров в фильме), чтобы я мог связать их и загрузить на сервер.
Продолжительность фильма должна составлять одну-две минуты. Надеюсь, вопрос был не слишком длинным и все понятно...
Спасибо!