Menu
CoddyTech

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 * dt

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

challenge icon

Desafío

Intermedio
  1. En el bucle, reemplaza vel = pygame.Vector2(0, 0) por acc = pygame.Vector2(0, 0) y haz que cada flecha establezca acc.x o acc.y en 600 o -600.
  2. Antes de mover el disco, suma acc * dt a vel y después réstale vel * 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

Practica por tu cuenta: Playground de Pygame