Координаты текстуры.
У вас должен быть один атлас текстуры для всех кадров всех разных анимированных вещей.
Желательно, чтобы у всех была одинаковая скорость анимации и одинаковое количество кадров.все время.
Допустим, есть два спрайта, которые имеют 2 кадра для всей анимации, и они хранятся в текстурном атласе 64x64.(РЕДАКТИРОВАТЬ: извините за неоднозначность, 64x64 PIXELS, просто потому, что это может означать, что у нас есть атлас плиток 64x64, то же самое везде, где я упоминаю об этом)
Теперь вам нужно иметь глобальный таймер с глобальным значением, которое указываеттекущий кадр анимации , а не игровой кадр.Он не должен зависеть от частоты кадров.
Указанное значение следует обновлять время от времени с желаемой скоростью, например:
current_frame = (current_frame + 1) % animation_length
Поскольку у нас есть 2 кадрав этом примере это будет выглядеть так:
# init
animation_length = 2
current_frame = 0
# updates:
current_frame = (0 + 1) % 2 # 1 % 2 -> 1
current_frame = (1 + 1) % 2 # 2 % 2 -> 0
...
Теперь вам нужно обновлять UV всех ваших спрайтов только при изменении кадра.
UV начинается слева направо и идетот 0 до 1 (насколько я помню, ради этого примера они делают, тссс).
Так как у нас есть 2 кадра каждый, мы можем вычислить «плитки» в координатах UV следующим образом:
tile_width = 1.0 / frames # 2 frames each, width will be 0.5
tile_height = 1.0 / sprites # 2 sprites each, height will be 0.5 too, perfect
Теперь в первом кадре вы генерируете свой UV как нормальный, вы просто берете вертикальный идентификатор или что-то в этом роде и используете tile_height * sprite_id
, чтобы получить текущую V
координату, и ваш U
вычисляетсянапример, tile_width * current_frame
.
Это предполагает, что у вас уже есть пакетная обработка спрайтов, поэтому вы проверяете каждый спрайт при обновлении и в основном просто пересчитываете новые UV с новым кадром, то есть все спрайты меняют свой кадр на следующий.один, ууу!
Если вы хотите иметь системы, независимые друг от друга, скажем, очень медленную анимацию для одних и более быструю для других, вам потребуются разные партии спрайтов или надлежащий расчет, откуда и где вам нужно обновить UV в вершине.буферный массив.Все остальное точно так же, за исключением того, что теперь current_frame не будет глобальным, а скорее будет содержаться, предпочтительно в каком-то списке или отдельном объекте, который управляет таймерами для анимации.
Вам не нужно ничего менять в своих шейдерах,им просто нужны правильные UV для кадров, и вы настроены.
Кстати, это очень просто, вы можете применить некоторую логику самостоятельно, чтобы вместо этого вы могли иметь сетку 16x16 из 32x32 пикселей в вашей текстуре, каждыйВ линейке спрайтов, имеющих 4 разные анимации, это могут быть либо состояния спрайта (атака, бег и т. д.), но то, как вы это сделаете, полностью зависит от вас, и самое главное - заставить его работать.Goodluck.
Но если вы сделаете это так, как я сказал, то состояние будет другим целым числом, а UV для состояния, при условии, что все состояния имеют одинаковую ширину, будет выглядеть так:
state_width = 1 / states
tile_width = 1 / (states * frames_per_state)
U = state_width * current_state + tile_width * current_frame
Теперь возникает одна проблема: игрок может запустить анимацию с последнего кадра атаки.
Это нормально, у сущностей с действиями должны быть отдельные таймеры, как я описал выше, для тонны спрайтов, которыепросто фон, как трава.Теперь, когда вы разделите его, у вас может быть правильный способ сбросить текущего кадра на 0 при назначении нового состояния.
Если ваши объекты являются объектами, вы можете написать надлежащие методы, которые пересчитываютУФ каждый раз, когда вы перестраиваете пакет спрайтов, используя эти спрайты, а затем сами таймеры могут содержаться в объектах.
Нам нужно что-то нарисовать?Проверьте состояние анимации, оно изменилось, нет?Отправьте UV, которые были рассчитаны ранее, в противном случае, подождите немного, нам нужно пересчитать, только затем добавить их в VBO, и, в общем, отрендерить вашу вещь, в конце концов, это будет выглядеть так, как будто у вас есть анимация, хотя на самом деле этопросто простая, но отличная УФ-манипуляция.
Goodluck.