Accelerazione e attrito
Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 21 di 32.
Il disco parte alla massima velocità e si ferma di colpo quando lo lasci andare. Sul ghiaccio dovrebbe aumentare la velocità e scivolare. Bastano due modifiche.
L'accelerazione indica quanto rapidamente cambia la velocità, in pixel al secondo, ogni secondo. I tasti impostano l'accelerazione, che modifica la velocità:
acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
acc.x = 600
vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dtAssegna un nuovo valore a acc a ogni fotogramma, così vale zero quando non tieni premuto alcun tasto. La velocità conserva il suo valore da un fotogramma all'altro, quindi il disco continua a scivolare.
L'attrito è la seconda riga. vel * 2 * dt è una piccola parte della velocità, più grande quando il disco è veloce. Sottraendola a ogni fotogramma, un disco veloce rallenta rapidamente e uno lento più gradualmente, finché si ferma. Un valore maggiore di 2 equivale a un pavimento più ruvido.
Se tieni premuto abbastanza a lungo, la spinta e l'attrito si bilanciano a una velocità massima di 600 / 2 = 300 pixel al secondo.
Sfida
Medio- Nel ciclo, sostituisci
vel = pygame.Vector2(0, 0)conacc = pygame.Vector2(0, 0)e fai in modo che ogni freccia impostiacc.xoacc.ysu600o-600. - Prima di spostare il disco, aggiungi
acc * dtavel, poi sottrai da quest’ultimavel * 2 * dt.
Provalo tu
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ice Puck")
clock = pygame.time.Clock()
pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(0, 0)
dt = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
vel = pygame.Vector2(0, 0)
if keys[pygame.K_LEFT]:
vel.x = -200
if keys[pygame.K_RIGHT]:
vel.x = 200
if keys[pygame.K_UP]:
vel.y = -200
if keys[pygame.K_DOWN]:
vel.y = 200
pos += vel * dt
pos.x = max(14, min(pos.x, 466))
pos.y = max(14, min(pos.y, 346))
screen.fill((200, 225, 240))
pygame.draw.circle(screen, (40, 50, 70), pos, 14)
pygame.display.flip()
dt = clock.tick(60) / 1000
pygame.quit()
Tutte le lezioni di Il game loop
1Muovi un quadrato
Apri una finestraRiempi lo sfondo4Muoversi nel tempo
Delta TimePixel al secondoVector2Accelerazione e attritoAvvolgersi ai bordi dello schermoEsercitati da solo: Playground Pygame