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.
Sfida
MedioFai 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()
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
1Effetti sonori
Caricare un suonoSuono al verificarsi di un eventoVolume del suonoSuoni e tasti tenuti premuti4Scuotimento dello schermo e flash all’impatto
Scuotimento dello schermoFlash all’impattoPausa all’impattoMantienilo discreto5Movimento fluido
Muoversi verso un obiettivoUna telecamera fluidaEffetto pop alla raccoltaFluidità a qualsiasi frequenza di fotogrammiEsercitati da solo: Playground Pygame