平滑的摄像机
本课属于 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() 会让绘制位置保持为整数像素,而变量会保留精确值,供下一帧使用。
滑入的菜单面板、逐渐减少的生命值条、不断增加的分数:任何移动到新值的东西都可以用同样的方式平滑变化。
挑战
中等让摄像机平滑地跟随。
- 将
camera_x = player.centerx - 240替换为一行代码,让camera_x每帧向player.centerx - 240移动十分之一。 - 保留限制它范围的那一行。
按“开始”,然后向右移动:摄像机会落在后面,随后追上来。然后按“检查”。
亲手试试
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 在线编辑器