Menu
CoddyTech

Дельта-время

Часть раздела Игровой цикл путешествия по 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, будет точным на любом компьютере. В оставшейся части этой главы перемещение объектов будет зависеть от времени.

challenge icon

Задание

Легко

Фитиль сгорает на 1 пиксель за кадр. Сделай так, чтобы он сгорал со временем:

  1. Перед циклом установи elapsed = 0 и dt = 0.
  2. Замени clock.tick(60) на dt = clock.tick(60) / 1000.
  3. В цикле прибавляй 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