Анимация по времени
Часть раздела Спрайты и изображения путешествия по Pygame на Coddy. Урок 27 из 36.
Счётчик кадров привязывает анимацию к частоте кадров. На компьютере, который обрабатывает только 30 кадров в секунду, крылья жука машут вдвое медленнее. Вместо этого привяжи анимацию ко времени.
pygame.time.get_ticks() — это количество миллисекунд, прошедших с момента вызова pygame.init(). Раздели это значение на длительность показа каждого изображения, и получишь количество прошедших изображений; % преобразует его в индекс:
frame_index = pygame.time.get_ticks() // 120 % len(frames)С 0 по 119 мс это изображение 0, с 120 по 239 мс — изображение 1, затем 2, а потом снова 0. Не нужно хранить счётчик и сбрасывать его: одна строка, вычисляемая заново на каждом кадре. Если игра замедлится, анимация пропустит изображение, вместо того чтобы замедлиться вместе с ней.
// делит и отбрасывает остаток: 250 // 120 равно 2. В третьем ряду этого листа изображён летящий жук в трёх позах — столбцы с 6-го по 8-й, уже вырезанные в frames.
Задание
Средне- Удалите
timerи счётчик. - Каждый кадр задавайте
frame_indexна основеpygame.time.get_ticks(), чтобы каждое из трёх изображений показывалось по 120 миллисекунд по порядку.
Попробуйте сами
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Flying Bug")
clock = pygame.time.Clock()
sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (6, 7, 8):
frame = sheet.subsurface((col * 24, 48, 24, 24))
frames.append(pygame.transform.scale_by(frame, 3))
frame_index = 0
timer = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
timer += 1
if timer == 10:
timer = 0
frame_index = (frame_index + 1) % len(frames)
screen.fill((20, 22, 40))
image = frames[frame_index]
screen.blit(image, image.get_rect(center=(320, 240)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Все уроки раздела Спрайты и изображения
1Загрузка изображений
Загрузить изображениеРазместить его с помощью RectПереместить изображениеЗамостить фонПрозрачные пиксели2Поворот, отражение, масштабирование
Вращение вокруг центраПовернись в направлении полётаИзменение масштаба изображенияВращение от исходного изображения5Пиксельно точные столкновения
Прямоугольники кажутся несправедливымиМаскиПиксельно точные спрайтыКруглые хитбоксы3Классы игровых объектов
Ваш первый классМетодыSelf — это объектСписок объектовОбъекты с изображениямиПодкласс6Анимация с помощью листов спрайтов
Разрезать лист спрайтовСчётчик кадровАнимация по времениОднократная анимация взрываПотренируйтесь самостоятельно: Песочница Pygame