Menu
CoddyTech

朝目标移动

本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 16 课,共 23 课。

点击后,圆形会瞬间传送到那里。让物体滑到目标位置会更好看:一开始很快,然后逐渐变慢,轻柔地停在目标位置。一行代码就能做到。每一帧,都移动剩余距离的一小部分:

x += (target_x - x) * 0.1
y += (target_y - y) * 0.1

target_x - x 表示还要移动多远。移动十分之一的距离,就能在第一帧走完 200 像素路程中的 20 像素。下一帧还剩 180 像素,所以移动 18 像素,再然后是 16.2 像素,依此类推。随着圆形接近目标,每一步都会缩短:它会逐渐减速,而不是戛然而止。

这通常称为lerp,是线性插值(linear interpolation)的简称。这个比例决定了移动的感觉:0.1 很平滑,0.3 很灵敏,0.02 则缓慢而轻盈。它永远不会恰好到达目标,但一秒后就会离目标不到一个像素,肉眼看不出来。

将 x 和 y 作为小数分别存储在各自的变量中。Rect 存储整数,所以 0.4 像素的一步会被截为 0,移动就会停在目标位置之前。

challenge icon

挑战

简单

让圆形滑向每次点击的位置。

  1. 找到 x = target_x 和 y = target_y。
  2. 把它们替换为代码行,让 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 在线编辑器