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 * dtErzeuge 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.
Aufgabe
Mittel- Ersetze in der Schleife
vel = pygame.Vector2(0, 0)durchacc = pygame.Vector2(0, 0)und lasse jeden Pfeilacc.xoderacc.yauf600oder-600setzen. - Addiere
acc * dtzuvel, bevor du den Puck bewegst, und ziehe anschließendvel * 2 * dtdavon 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
1Bewege ein Quadrat
Öffne ein FensterFülle den Hintergrund4Bewegung nach Zeit
Delta-ZeitPixel pro SekundeVector2Beschleunigung und ReibungAm Bildschirmrand umkehrenÜbe selbstständig: Pygame-Playground