Menu
CoddyTech

Una telecamera fluida

Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 17 di 23.

In questo gioco di corse, la telecamera è incollata al giocatore: qualunque cosa faccia, il giocatore rimane al centro dello schermo e il mondo scorre sotto di lui. Funziona, ma ogni partenza e ogni frenata fa sobbalzare l'intera visuale.

Fai seguire alla telecamera lo stesso movimento graduale del cerchio. Il suo obiettivo è la posizione che centrerebbe il giocatore:

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

Il giocatore si muove come prima; è solo la visuale a spostarsi gradualmente. Quando il giocatore inizia a correre, la telecamera resta un po' indietro, così il giocatore avanza rispetto al centro. Quando si ferma, la telecamera scivola per raggiungerlo e si assesta di nuovo con il giocatore al centro. La seconda riga mantiene comunque la telecamera all'interno del mondo.

Il mondo viene disegnato a -int(camera_x) come prima. Ora camera_x è un numero decimale; int() mantiene il disegno allineato ai pixel interi, mentre la variabile conserva il suo valore esatto per il fotogramma successivo.

Un pannello di menu che scorre in vista, una barra della salute che si svuota, un punteggio che aumenta: qualsiasi elemento si sposti verso un nuovo valore può farlo gradualmente allo stesso modo.

challenge icon

Sfida

Medio

Fai in modo che la telecamera segua in modo fluido: sostituisci camera_x = player.centerx - 240 con una riga che sposta camera_x di un decimo verso player.centerx - 240 a ogni fotogramma. Mantieni la riga che lo limita.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Suoni e sensazioni di gioco

Esercitati da solo: Playground Pygame