Menu
CoddyTech

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

Twó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ę.

challenge icon

Wyzwanie

Średni
  1. W pętli zastąp vel = pygame.Vector2(0, 0) przez acc = pygame.Vector2(0, 0) i ustawiaj acc.x lub acc.y na 600 albo -600 po naciśnięciu każdej strzałki.
  2. Przed przesunięciem krążka dodaj acc * dt do vel, a następnie odejmij od niego vel * 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