Лучшие практики анимации спрайтов

18

Я бы хотел лучше понять, как люди в реальном мире справляются со своей анимацией.

Вы загружаете 1 большое изображение, а затем рисуете разные прямоугольники, основываясь на кадре анимации?

Вы загружаете файлы изображений X в массив и рисуете элемент в массиве, основываясь на кадре анимации?

Как вы справляетесь с анимацией разной длины для разных спрайтов?

Скажем, ходьба персонажа занимает 4 - 8 кадров, а волны на пляже - 2 - 3 кадра. Как бы вы справились с этой ситуацией? См. ниже

Dim Waves(1) as Sprite
Dim Char(5) as Sprite

Sub Animate()
     Frame += 1
     Draw Char(Frame)
     Draw Waves(Frame)
     If Frame = 5 Then Frame = 0
End Sub

Очевидно, что в результате Waves возникнет ошибка «за пределами границ».

Или ваш спрайт беспокоится о собственной анимации, а не о кадре вообще. Каждый спрайт знает свой собственный цикл анимации?

jblaske
источник

Ответы:

23

В прошлом я делал это, отделяя данные анимации от воспроизведения анимации . Затем Animationможет стать массивом Framesи несколькими свойствами, которые описывают, как должна вести себя анимация (если она цикличная и т. Д.).

Я обычно загружаю одно изображение и рисую его части.

Каждая Frameанимация по сути представляет собой прямоугольник и отрезок времени. Это позволяет отображать некоторые кадры дольше, чем другие, что может или не может быть то, что вы хотите. Если вы хотите, чтобы все кадры в вашей анимации отображались в течение одинакового промежутка времени, сохраните их в своем Animationобъекте.

Все, что нужно для воспроизведения анимации, имеет свою собственную, на AnimationPlayerкоторую можно указать Animation. Объект player заботится о воспроизведении анимации и делает доступным «текущий кадр».

Преимущество этого для меня заключалось в том, что у меня мог быть один экземпляр, на Animationкоторый многие объекты могли бы указывать и играть разные роли одновременно. Также было легко изменять анимацию, просто указывая на AnimationPlayerдругой Animationобъект и сбрасывая воспроизведение.

Изменить : Вот довольно простая реализация JavaScript системы, описанной выше . Я бросил это вместе через несколько минут в качестве демонстрации . «Реальный» код будет иметь больше возможностей. Для работы вам понадобится современный браузер, который поддерживает Canvas и Data URI.

Зак Человек
источник
1
Что он сказал. Кроме того, часто удобно иметь смещение по оси x / y для каждого кадра в анимации, чтобы можно было плотно упаковать изображения спрайтов в их ограничивающие рамки, а затем поместить их в нужное место в анимации. Это также позволяет вам делать некоторые базовые вещи, такие как покачивание, просто используя одно изображение.
Великолепно
Да, я полностью согласен. Фактически, система анимации, которую я использую, позволяет это сделать. Это значительно облегчает изменение положения любого кадра без необходимости редактировать данные изображения.
Зак Человек
Хороший рабочий пример, WOW Thumbs up. Рекомендую это.
DFectuoso
Важным ограничением вида анимации является то, что фигуру нельзя рассматривать под другим углом - отойти от зрителя, идти к зрителю и т. Д. Или я ошибаюсь?
Маджид Фуладпур
@MajidFouladpour Я не думаю, что такого рода ограничения существуют с использованием этой техники. У вас просто есть разные объекты AnimationData для каждого «угла обзора».
Зак Человек
1

Мне бы анимация знала, сколько у него кадров. Где и как они хранятся, относительно не имеет значения, за исключением проблем с производительностью (например, вы можете захотеть, чтобы они были в одной текстуре). Я бы никогда не добавил 1 к framecount, я бы добавил deltaTime * animSpeed ​​и преобразовал бы это значение в целое число при отображении. Таким образом, вы можете замедлить или ускорить анимацию и не зависеть от частоты кадров.

Таким образом, у спрайта будет анимация, которая обновляется сама.

Кая
источник
0

Почему бы просто не хранить количество кадров для каждого из ваших объектов? Лично я передаю количество кадров в анимации своим объектам в их конструкторах, затем у меня есть стандартная функция Animate (), которая принимает количество кадров в анимации.

SD021
источник
0

Это зависит от реализации. В моем движке я делаю анимацию как в Direct3D, так и в DirectDraw.

В DirectDraw я создаю одно большое изображение. В любом случае все это сохраняется в системной памяти, что в конечном итоге сводится к одномерному блоку данных.

Плюсы:

  • Легко перемещаться между кадрами. Измените начальный указатель, добавьте высоту (общую ширину изображения) каждый у, и вы получите золотой цвет.

Минусы:

  • Нельзя просто скопировать один кадр на экран, вы должны сделать это вручную.

  • Гигантский блок памяти. Шатаясь вокруг, приходит штраф.

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

Плюсы:

  • Вы можете скопировать кадр прямо на экран, потому что все они являются отдельными объектами.

Минусы:

  • Недостаток выравнивания памяти.
knight666
источник
0

В своих играх я дал базовому классу Sprite знания о том, как рисовать себя, и все анимированные элементы наследуют эти знания: количество и продолжительность анимационных кадров, положение на экране и т. Д. Основной игровой цикл просто повторяет все из спрайтов, прося каждого нарисовать себя так, как считает нужным. Кажется, работает довольно хорошо, и немного более модульно для загрузки: если вы добавляете новый спрайт, который имеет другой цикл анимации (или даже более сложный: несколько состояний анимации), вам не нужно возвращаться и переписывать вашу Animate () рутина для размещения дополнительной сложности:

Dim Waves as Sprite
Dim Char as Sprite

Sub Animate()
     Char.update()
     Waves.update()
End Sub

Каждый раз, когда вызывается метод update () спрайта, он знает, должен ли он перерисовать тот же кадр, что и в прошлый раз, перейти к следующему кадру в текущей анимации, перейти на новую анимацию и т. Д.

Это дает дополнительное преимущество, так как значительно упрощает настройку частоты кадров для соответствия разным скоростям рендеринга часов / платформ, поскольку единственное изменение - это то, как часто вы вызываете Animate ().

Райли Коррадини
источник