Menu
CoddyTech

Una cámara suave

Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 17 de 23.

La cámara de este juego de carretera está pegada al jugador: haga lo que haga, el jugador permanece en el centro de la pantalla y el mundo se desliza bajo sus pies. Funciona, pero cada vez que arranca o se detiene, toda la vista da un tirón.

Haz que la cámara siga al jugador con la misma suavización que el círculo. Su objetivo es la posición que centraría al jugador:

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

El jugador se mueve como antes; solo se suaviza la vista. Cuando el jugador empieza a correr, la cámara se queda un poco atrás, así que el jugador se adelanta al centro. Cuando se detiene, la cámara se desliza para alcanzarlo y se estabiliza con el jugador de nuevo en el medio. La segunda línea sigue manteniendo la cámara dentro del mundo.

El mundo se dibuja en -int(camera_x) como antes. Ahora camera_x es un número decimal; int() mantiene el dibujo en píxeles enteros, mientras que la variable conserva su valor exacto para el siguiente fotograma.

Un panel de menú que se desliza, una barra de salud que se agota, una puntuación que aumenta: cualquier elemento que se mueva a un nuevo valor puede suavizarse de la misma manera.

challenge icon

Desafío

Intermedio

Haz que la cámara siga suavemente: reemplaza camera_x = player.centerx - 240 por una línea que mueva camera_x una décima parte del camino hacia player.centerx - 240 en cada fotograma. Conserva la línea que lo limita.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sonido y sensaciones del juego

Practica por tu cuenta: Playground de Pygame