加速度与摩擦力
本课属于 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 像素。
挑战
中等让冰球像在冰面上一样滑动。
- 在循环中,将
vel = pygame.Vector2(0, 0)替换为acc = pygame.Vector2(0, 0),并让每个方向键将acc.x或acc.y设为600或-600。 - 移动冰球之前,将
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 在线编辑器