Это должно быть легко.
Если вы записываете номер кадра в переменную, вы можете смодулировать его с количеством кадров, которое необходимо получить для отображения номера кадра анимации.
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
)
Примечание о вашей обработке событий. Если вы удерживаете, скажем, влево и нажимаете вправо, но продолжаете удерживать влево, спрайт перестает двигаться, потому что последнее обработанное вами событие было событием keyup, несмотря на то, что я все еще удерживаю влево.
Если это не то, что вам нужно, вы можете обойти это, ведя запись состояний вверх / вниз интересующих вас клавиш или используя pygame.key.get_pressed интерфейс.
С другой стороны, вы, похоже, стремитесь к фиксированной частоте кадров и в то же время определяете, как далеко перемещать ваш спрайт на основе времени, затраченного на последний кадр. На мой взгляд, это, вероятно, не идеально.
2D-экшн игры обычно должны работать предсказуемо. Если на вашем компьютере в фоновом режиме запускается некоторый процесс, который приводит к тому, что ваша игра перестает работать со скоростью 60 кадров в секунду, вероятно, предпочтительнее замедлять ее, а не заставлять ваши объекты пропускать огромные расстояния между кадрами. Представляете, если бы это произошло в 2D-игре, такой как Metal Slug, где вам нужно прыгать, избегая пуль?
Это также значительно упрощает любые физические вычисления. Вам нужно будет сделать суждение, основываясь на том, что это за игра.