朝目标移动
本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 16 课,共 23 课。
点击后,圆形会瞬间传送到那里。让物体滑到目标位置会更好看:一开始很快,然后逐渐变慢,轻柔地停在目标位置。一行代码就能做到。每一帧,都移动剩余距离的一小部分:
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x 表示还要移动多远。移动十分之一的距离,就能在第一帧走完 200 像素路程中的 20 像素。下一帧还剩 180 像素,所以移动 18 像素,再然后是 16.2 像素,依此类推。随着圆形接近目标,每一步都会缩短:它会逐渐减速,而不是戛然而止。
这通常称为lerp,是线性插值(linear interpolation)的简称。这个比例决定了移动的感觉:0.1 很平滑,0.3 很灵敏,0.02 则缓慢而轻盈。它永远不会恰好到达目标,但一秒后就会离目标不到一个像素,肉眼看不出来。
将 x 和 y 作为小数分别存储在各自的变量中。Rect 存储整数,所以 0.4 像素的一步会被截为 0,移动就会停在目标位置之前。
挑战
简单让圆形滑向每次点击的位置。
- 找到
x = target_x和y = target_y。 - 把它们替换为代码行,让
x和y每帧向目标移动十分之一的距离。
按“开始”并点击:圆形会滑到那里,接近目标时逐渐减速。然后按“检查”。
亲手试试
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()
x, y = 240, 180
target_x, target_y = 240, 180
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
target_x, target_y = event.pos
x = target_x
y = target_y
screen.fill((30, 30, 46))
pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
pygame.display.flip()
clock.tick(60)
pygame.quit()
音效与游戏体验中的所有课
自己练习: Pygame 在线编辑器