Menu
CoddyTech

加速度与摩擦力

本课属于 Coddy Pygame 学习旅程的“游戏循环”单元。第 24 课,共 35 课。

冰球一开始就以全速移动,松开按键后会立刻停下。在冰面上,它应该逐渐加速并滑行。做两处改动即可。

加速度表示速度每秒变化多少像素。按键会设置加速度,而加速度会改变速度:

acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
    acc.x = 600

vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dt

每一帧都要重新创建 acc,这样没有按下任何按键时,它的值就是 0。速度会在每一帧之间保持原值,因此冰球会继续滑行。

摩擦力对应第二行。vel * 2 * dt 是速度的一小部分,冰球越快,这部分就越大。每一帧都减去这部分,会让快速移动的冰球很快减速,让慢速移动的冰球缓慢减速,直到停下。数字 2 越大,地面就越粗糙。

按住按键足够长时间后,推动力和摩擦力会达到平衡,冰球的最高速度为每秒 600 / 2 = 300 像素。

challenge icon

挑战

中等

让冰球像在冰面上一样滑动。

  1. 在循环中,将 vel = pygame.Vector2(0, 0) 替换为 acc = pygame.Vector2(0, 0),并让每个方向键将 acc.x 或 acc.y 设为 600 或 -600。
  2. 移动冰球之前,将 acc * dt 加到 vel 上,然后从中减去 vel * 2 * dt。

按“运行”,再按一个方向键:冰球会滑动并逐渐减速。然后按“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ice Puck")
clock = pygame.time.Clock()

pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(0, 0)
dt = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    vel = pygame.Vector2(0, 0)
    if keys[pygame.K_LEFT]:
        vel.x = -200
    if keys[pygame.K_RIGHT]:
        vel.x = 200
    if keys[pygame.K_UP]:
        vel.y = -200
    if keys[pygame.K_DOWN]:
        vel.y = 200

    pos += vel * dt
    pos.x = max(14, min(pos.x, 466))
    pos.y = max(14, min(pos.y, 346))

    screen.fill((200, 225, 240))
    pygame.draw.circle(screen, (40, 50, 70), pos, 14)
    pygame.display.flip()
    dt = clock.tick(60) / 1000

pygame.quit()

游戏循环中的所有课

自己练习: Pygame 在线编辑器