Я бы хотел лучше понять, как люди в реальном мире справляются со своей анимацией.
Вы загружаете 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 возникнет ошибка «за пределами границ».
Или ваш спрайт беспокоится о собственной анимации, а не о кадре вообще. Каждый спрайт знает свой собственный цикл анимации?
Мне бы анимация знала, сколько у него кадров. Где и как они хранятся, относительно не имеет значения, за исключением проблем с производительностью (например, вы можете захотеть, чтобы они были в одной текстуре). Я бы никогда не добавил 1 к framecount, я бы добавил deltaTime * animSpeed и преобразовал бы это значение в целое число при отображении. Таким образом, вы можете замедлить или ускорить анимацию и не зависеть от частоты кадров.
Таким образом, у спрайта будет анимация, которая обновляется сама.
источник
Почему бы просто не хранить количество кадров для каждого из ваших объектов? Лично я передаю количество кадров в анимации своим объектам в их конструкторах, затем у меня есть стандартная функция Animate (), которая принимает количество кадров в анимации.
источник
Это зависит от реализации. В моем движке я делаю анимацию как в Direct3D, так и в DirectDraw.
В DirectDraw я создаю одно большое изображение. В любом случае все это сохраняется в системной памяти, что в конечном итоге сводится к одномерному блоку данных.
Плюсы:
Минусы:
Нельзя просто скопировать один кадр на экран, вы должны сделать это вручную.
Гигантский блок памяти. Шатаясь вокруг, приходит штраф.
В Direct3D я использую отдельные текстуры. Это потому, что я понятия не имею об ограничениях текстур устройства, поэтому я не знаю, поддерживает ли оно даже текстуры, которые имеют размер всего изображения.
Плюсы:
Минусы:
источник
В своих играх я дал базовому классу Sprite знания о том, как рисовать себя, и все анимированные элементы наследуют эти знания: количество и продолжительность анимационных кадров, положение на экране и т. Д. Основной игровой цикл просто повторяет все из спрайтов, прося каждого нарисовать себя так, как считает нужным. Кажется, работает довольно хорошо, и немного более модульно для загрузки: если вы добавляете новый спрайт, который имеет другой цикл анимации (или даже более сложный: несколько состояний анимации), вам не нужно возвращаться и переписывать вашу Animate () рутина для размещения дополнительной сложности:
Каждый раз, когда вызывается метод update () спрайта, он знает, должен ли он перерисовать тот же кадр, что и в прошлый раз, перейти к следующему кадру в текущей анимации, перейти на новую анимацию и т. Д.
Это дает дополнительное преимущество, так как значительно упрощает настройку частоты кадров для соответствия разным скоростям рендеринга часов / платформ, поскольку единственное изменение - это то, как часто вы вызываете Animate ().
источник