Menu
CoddyTech

时间增量

本课属于 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 测量的时间在任何电脑上都准确。本章接下来会根据时间来移动物体。

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 像素,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 在线编辑器