Menu
CoddyTech

平滑的摄像机

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

这款道路游戏中的镜头紧跟着玩家:无论玩家做什么,他们都会停留在屏幕中央,世界则在他们脚下滑动。这样虽然能用,但每次开始和停止都会让整个画面猛地一顿。

让镜头像圆形一样平滑跟随。它的目标位置就是能让玩家居中的位置:

camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))

玩家仍按之前的方式移动,只有画面会平滑移动。玩家开始跑动时,镜头会稍微滞后,所以玩家会跑到屏幕中心前方。玩家停下时,镜头会平滑地追上来,最后让玩家重新回到画面中央。第二行代码仍会将镜头限制在世界范围内。

世界仍像之前那样绘制在 -int(camera_x) 处。现在,camera_x 是一个小数;int() 会让绘制位置保持为整数像素,而变量会保留精确值,供下一帧使用。

滑入的菜单面板、逐渐减少的生命值条、不断增加的分数:任何移动到新值的东西都可以用同样的方式平滑变化。

challenge icon

挑战

中等

让摄像机平滑地跟随。

  1. 将 camera_x = player.centerx - 240 替换为一行代码,让 camera_x 每帧向 player.centerx - 240 移动十分之一。
  2. 保留限制它范围的那一行。

按“开始”,然后向右移动:摄像机会落在后面,随后追上来。然后按“检查”。

亲手试试

import pygame

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

WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 6
    if keys[pygame.K_RIGHT]:
        player.x += 6
    player.left = max(player.left, 0)
    player.right = min(player.right, WORLD_WIDTH)

    camera_x = player.centerx - 240
    camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
    for post_x in range(0, WORLD_WIDTH, 120):
        pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
    pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

音效与游戏体验中的所有课

自己练习: Pygame 在线编辑器