Przyspieszenie i tarcie
Część sekcji Pętla gry ścieżki Pygame w Coddy. Lekcja 21 z 32.
Krążek zaczyna z pełną prędkością i natychmiast się zatrzymuje, gdy puszczasz klawisz. Na lodzie powinien nabierać prędkości i się ślizgać. Wystarczą dwie zmiany.
Przyspieszenie określa, jak szybko zmienia się prędkość — w pikselach na sekundę w każdej sekundzie. Klawisze ustawiają przyspieszenie, a przyspieszenie zmienia prędkość:
acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
acc.x = 600
vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dtTwórz acc od nowa w każdej klatce, aby miało wartość zero, gdy żaden klawisz nie jest wciśnięty. Prędkość zachowuje swoją wartość między klatkami, więc krążek nadal się ślizga.
Tarcie to druga linia. vel * 2 * dt to niewielka część prędkości, większa, gdy krążek porusza się szybciej. Odejmowanie jej w każdej klatce szybko spowalnia szybko poruszający się krążek, a wolno poruszający się — łagodnie, aż się zatrzyma. Większa liczba niż 2 oznacza bardziej chropowatą nawierzchnię.
Jeśli przytrzymasz klawisz wystarczająco długo, siła pchająca i tarcie zrównoważą się przy maksymalnej prędkości 600 / 2 = 300 pikseli na sekundę.
Wyzwanie
Średni- W pętli zastąp
vel = pygame.Vector2(0, 0)przezacc = pygame.Vector2(0, 0)i ustawiajacc.xlubacc.yna600albo-600po naciśnięciu każdej strzałki. - Przed przesunięciem krążka dodaj
acc * dtdovel, a następnie odejmij od niegovel * 2 * dt.
Spróbuj swoich sił
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()
Wszystkie lekcje w sekcji Pętla gry
Poćwicz samodzielnie: Edytor online Pygame