Дельта-время
Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 18 из 32.
clock.tick(60) не просто ждёт. Он возвращает количество миллисекунд, прошедших с момента последнего вызова: около 17 при 60 кадрах в секунду и больше на медленном компьютере, который не успевает. Разделите это число на 1000 — и получите dt, длительность кадра в секундах:
dt = 0
while running:
# обработка событий, обновление, отрисовка, обновление экрана
dt = clock.tick(60) / 1000В первом кадре dt равно 0, а после этого — длительности последнего кадра. Складывайте эти значения, и получите время, прошедшее с момента запуска игры:
elapsed += dtПодсчёт кадров, как в Gem Hunt, показывает время только тогда, когда игра работает с постоянной частотой 60 кадров в секунду. Время, измеренное с помощью dt, будет точным на любом компьютере. В оставшейся части этой главы перемещение объектов будет зависеть от времени.
Задание
ЛегкоФитиль сгорает на 1 пиксель за кадр. Сделай так, чтобы он сгорал со временем:
- Перед циклом установи
elapsed = 0иdt = 0. - Замени
clock.tick(60)наdt = clock.tick(60) / 1000. - В цикле прибавляй
dtкelapsedи установи ширину фитиля равнойmax(0, 480 - elapsed * 40), чтобы он сгорал на 40 пикселей в секунду.
Попробуйте сами
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fuse")
clock = pygame.time.Clock()
width = 480
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
width = max(0, width - 1)
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (255, 150, 40), (0, 170, width, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Все уроки раздела Игровой цикл
Потренируйтесь самостоятельно: Песочница Pygame