(四)用经过时间推导移动距离
1. 每帧位移会跟着帧数改变
一帧是一次画面更新,FPS(frames per second)表示每秒的帧数。一个方块每帧向右走 4 像素:30 帧走 120 像素,60 帧走 240 像素,120 帧走 480 像素。相同一秒,在不同电脑上可能得到不同速度:
# 项目文件:demos/fps_math.py
# 对同样一秒计算位移:固定每帧4像素会随帧数改变,240像素/秒保持相同距离。
for fps in [30, 60, 120, 144]:
per_frame, per_second = 0.0, 0.0
for _ in range(fps):
per_frame += 4
per_second += 240 * (1 / fps)
print(fps, "每帧累加", int(per_frame), "按秒计算", f"{per_second:.1f}")输出中“每帧累加”分别为 120、240、480、576;“按秒计算”都为 240.0。原因是后者先确定速度为每秒 240 像素,再乘这一帧经过的秒数。
| 一秒中的帧数 | 每帧经过秒数 | 每帧按速度计算的位移 | 一秒累计 |
|---|---|---|---|
| 30 | 约 0.033333 | 8 像素 | 240 像素 |
| 60 | 约 0.016667 | 4 像素 | 240 像素 |
| 120 | 约 0.008333 | 2 像素 | 240 像素 |
| 144 | 约 0.006944 | 约 1.666667 像素 | 240 像素 |
2. Clock 把毫秒交给这一轮计算
clock.tick(60) 返回距离上一次 tick 的毫秒数,并通过等待限制循环节奏。除以 1000 得到秒,通常记为 dt。位置更新写为 位置 += 速度 × dt,单位就是 像素/秒 × 秒 = 像素。
60 是节奏目标,某一帧实际花了多少时间由返回值给出;clock.get_fps() 则观察一段时间内的平均帧率。完整游戏会进一步把显示帧率与固定逻辑步长分开,避免一次较长的显示帧直接跳过整个碰撞过程。Clock 与时间