时间增量
本课属于 Coddy Pygame 学习旅程的“游戏循环”单元。第 21 课,共 35 课。
clock.tick(60) 不只是等待。它会返回自上次调用以来经过的毫秒数:每秒 60 帧时约为 17 毫秒,在运行较慢、跟不上节奏的电脑上则会更长。除以 1000,就能得到 dt,也就是一帧的秒数:
dt = 0
while running:
# 处理事件,更新,绘制,调用 flip 刷新屏幕
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 像素,12 秒后烧完。然后按“检查”。
亲手试试
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 在线编辑器