Muoversi verso un obiettivo
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 16 di 23.
Fai clic e il cerchio si teletrasporta lì. Un oggetto che scivola al suo posto ha un aspetto migliore: all’inizio veloce, poi più lento, finché si ferma delicatamente nella posizione desiderata. Basta una riga. A ogni fotogramma, spostalo di una frazione della distanza rimanente:
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x indica quanta strada resta da fare. Percorrere un decimo della distanza significa coprire 20 pixel su un tragitto di 200 pixel nel primo fotogramma. Nel fotogramma successivo restano 180 pixel, quindi si sposta di 18, poi di 16.2, e così via. I passi si accorciano man mano che il cerchio si avvicina: rallenta gradualmente invece di fermarsi di colpo.
Questo metodo è spesso chiamato lerp, abbreviazione di interpolazione lineare. La frazione determina la sensazione: 0.1 è fluido, 0.3 è scattante, 0.02 è lento e fluttuante. Non raggiunge mai esattamente il bersaglio, ma dopo un secondo si trova a meno di un pixel di distanza, cosa che nessuno può vedere.
Mantieni x e y come numeri decimali in variabili separate. Un Rect memorizza numeri interi, quindi un passo di 0.4 pixel verrebbe arrotondato a 0 e il movimento si bloccherebbe prima di raggiungere il bersaglio.
Sfida
FacileIl cerchio salta a ogni clic. Fai in modo che scivoli: sostituisci x = target_x e y = target_y con righe che spostino x e y di un decimo della distanza verso il bersaglio a ogni fotogramma.
Provalo tu
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()
x, y = 240, 180
target_x, target_y = 240, 180
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
target_x, target_y = event.pos
x = target_x
y = target_y
screen.fill((30, 30, 46))
pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
pygame.display.flip()
clock.tick(60)
pygame.quit()
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