Aceleración y fricción
Parte de la sección El bucle del juego del Journey de Pygame de Coddy. Lección 21 de 32.
El disco empieza a toda velocidad y se detiene en seco cuando lo sueltas. Sobre el hielo debería ganar velocidad y deslizarse. Dos cambios lo consiguen.
La aceleración indica cuánto cambia la velocidad, en píxeles por segundo, cada segundo. Las teclas establecen la aceleración y esta cambia la velocidad:
acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
acc.x = 600
vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dtCrea acc de nuevo en cada fotograma, para que sea cero cuando no se mantenga ninguna tecla pulsada. La velocidad conserva su valor de un fotograma al siguiente, así que el disco sigue deslizándose.
La fricción es la segunda línea. vel * 2 * dt es una pequeña parte de la velocidad, mayor cuando el disco va rápido. Restarla en cada fotograma ralentiza rápidamente un disco rápido y suavemente uno lento, hasta que se detiene. Un número mayor que 2 representa un suelo más áspero.
Si mantienes la tecla pulsada el tiempo suficiente, el impulso y la fricción se equilibran a una velocidad máxima de 600 / 2 = 300 píxeles por segundo.
Desafío
Intermedio- En el bucle, reemplaza
vel = pygame.Vector2(0, 0)poracc = pygame.Vector2(0, 0)y haz que cada flecha establezcaacc.xoacc.yen600o-600. - Antes de mover el disco, suma
acc * dtavely después réstalevel * 2 * dt.
Pruébalo tú mismo
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()
Todas las lecciones de El bucle del juego
1Mueve un cuadrado
Abre una ventanaRellena el fondo4Movimiento basado en el tiempo
Tiempo deltaPíxeles por segundoVector2Aceleración y fricciónReaparecer al otro lado de la pantallaPractica por tu cuenta: Playground de Pygame