Menu
CoddyTech

Uma Câmera Suave

Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 17 de 23.

Neste jogo de corrida, a câmera fica grudada no jogador: não importa o que o jogador faça, ele permanece no centro da tela enquanto o mundo desliza sob ele. Funciona, mas cada arrancada e parada sacode a tela inteira.

Faça a câmera acompanhar com a mesma suavização que o círculo. O alvo dela é a posição que centralizaria o jogador:

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

O jogador se move como antes; só a tela tem o movimento suavizado. Quando o jogador começa a correr, a câmera fica um pouco para trás, então o jogador corre à frente do centro. Quando ele para, a câmera desliza para alcançá-lo e se estabiliza com o jogador novamente no meio. A segunda linha ainda mantém a câmera dentro dos limites do mundo.

O mundo é desenhado em -int(camera_x) como antes. camera_x agora é um número decimal; int() mantém o desenho alinhado a pixels inteiros, enquanto a variável preserva seu valor exato para o próximo quadro.

Um painel de menu que desliza para dentro, uma barra de vida que se esvazia, uma pontuação que aumenta: qualquer coisa que se mova para um novo valor pode ser suavizada da mesma maneira.

challenge icon

Desafio

Médio

Faça a câmera acompanhar suavemente: substitua camera_x = player.centerx - 240 por uma linha que mova camera_x um décimo do caminho em direção a player.centerx - 240 a cada quadro. Mantenha a linha que limita seu valor.

Experimente você mesmo

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()
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Som e sensação de jogo

Pratique por conta própria: Playground de Pygame