Menu
CoddyTech

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.1

target_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.

challenge icon

Sfida

Facile

Il 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

Esercitati da solo: Playground Pygame