Пигмея:Теория анимации спрайтов - Нужна обратная связь
Вопрос
После некоторой настройки некоторого кода, который я получил от кого-то, чтобы заставить символы изображения перемещаться в соответствии с его направлением и вводом вверх вниз влево вправо, я собрал это вместе:(надеюсь, код не слишком запутанный)
Код перемещения персонажа + изображение
Лист спрайта выполняется только по длине, поэтому в основном каждый раздел спрайта представляет собой отдельное действие.Теперь, есть ли способ, которым я мог бы создать код, который работает с текущим, чтобы переключаться с заданного "действия", чтобы создать анимацию?
Например:"Беги налево" - это спрайт 3.Итак, после того, как мы обозначим этот столбец, можно ли будет зациклить сколько угодно кадров анимации запуска (скажем, 4), чтобы создать анимацию?
Пример Изображения: http://animania1.ca/ShowFriends/dev/example.jpg
Решение
Это должно быть легко.
Если вы записываете номер кадра в переменную, вы можете умножить его на количество кадров, необходимое для получения номера кадра анимации для отображения.
frame_count = 0
animation_frames = 4
while quit == False:
# ...
# snip
# ...
area = pygame.Rect(
image_number * 100,
(frame_count % animation_frames) * 150,
100,
150
)
display.blit(sprite, sprite_pos, area)
pygame.display.flip()
frame_count += 1
Если разные действия имеют разное количество кадров, вам придется обновлять animation_frames при обновлении image_number.
Кроме того, это предполагает, что можно воспроизводить анимацию, начиная с Любой рамка.Если это не так, вам нужно будет записать, каким было количество кадров на момент начала действия, и убрать это из количества кадров до вычисления по модулю:
area = pygame.Rect(
image_number * 100,
((frame_count - action_start_frame) % animation_frames) * 150,
100,
150
)
Примечание об обработке вашего события.Если вы удерживаете нажатой, скажем, клавишу left и нажимаете вправо, но продолжаете удерживать нажатой клавишу left, спрайт перестает двигаться, потому что последним обработанным вами событием было событие keyup, несмотря на то, что я все еще удерживаю клавишу left.
Если это не то, что вы хотите, вы можете обойти это, либо ведя учет состояний подъема / спада интересующих вас ключей, либо используя pygame.ключ.get_pressed интерфейс.
С другой стороны, вы, похоже, стремитесь к фиксированной частоте кадров и в то же время определяете, как далеко переместить ваш спрайт, основываясь на времени, затраченном на последний кадр.На мой взгляд, это, вероятно, не идеально.
2D-экшн-игры, как правило, должны работать предсказуемым образом.Если на вашем компьютере в фоновом режиме запускается какой-либо процесс с высокой нагрузкой на процессор, из-за которого ваша игра больше не может выдавать 60 кадров в секунду, вероятно, предпочтительнее, чтобы он замедлился, а не ваши объекты начали пропускать огромные расстояния между кадрами.Представьте, если бы это произошло в 2D-экшене вроде Metal Slug, где вам приходится прыгать, избегая пуль?
Это также значительно упрощает любые физические вычисления.Вам придется принять решение, основываясь на том, к какому типу игры это относится.