Menu
CoddyTech

Beschleunigung und Reibung

Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 21 von 32.

Der Puck startet mit voller Geschwindigkeit und kommt sofort zum Stillstand, wenn du loslässt. Auf Eis sollte er Geschwindigkeit aufbauen und gleiten. Zwei Änderungen bewirken das.

Beschleunigung gibt an, wie schnell sich die Geschwindigkeit pro Sekunde ändert, in Pixeln pro Sekunde, jede Sekunde. Die Tasten legen die Beschleunigung fest, und die Beschleunigung verändert die Geschwindigkeit:

acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
    acc.x = 600

vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dt

Erzeuge acc in jedem Frame neu, damit sie null ist, wenn keine Taste gedrückt wird. Die Geschwindigkeit behält ihren Wert von Frame zu Frame, sodass der Puck weitergleitet.

Reibung ist die zweite Zeile. vel * 2 * dt ist ein kleiner Teil der Geschwindigkeit, der größer ist, wenn der Puck schnell ist. Wenn du diesen Teil in jedem Frame abziehst, wird ein schneller Puck schnell und ein langsamer sanft abgebremst, bis er zum Stillstand kommt. Eine größere Zahl als 2 entspricht einem raueren Boden.

Wenn du die Taste lange genug gedrückt hältst, gleichen sich Schub und Reibung bei einer Höchstgeschwindigkeit von 600 / 2 = 300 Pixeln pro Sekunde aus.

challenge icon

Aufgabe

Mittel
  1. Ersetze in der Schleife vel = pygame.Vector2(0, 0) durch acc = pygame.Vector2(0, 0) und lasse jeden Pfeil acc.x oder acc.y auf 600 oder -600 setzen.
  2. Addiere acc * dt zu vel, bevor du den Puck bewegst, und ziehe anschließend vel * 2 * dt davon ab.

Probier es selbst

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()

Alle Lektionen in Die Spielschleife

Übe selbstständig: Pygame-Playground