Menu
CoddyTech

Ускорение и трение

Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 21 из 32.

Шайба начинает движение на полной скорости и резко останавливается, когда ты отпускаешь клавишу. На льду она должна набирать скорость и скользить. Для этого нужны два изменения.

Ускорение — это скорость изменения скорости, измеряемая в пикселях в секунду за каждую секунду. Клавиши задают ускорение, а ускорение меняет скорость:

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

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

Создавай acc заново в каждом кадре, чтобы оно было равно нулю, если ни одна клавиша не нажата. Скорость сохраняет своё значение от кадра к кадру, поэтому шайба продолжает скользить.

Трение — это вторая строка. vel * 2 * dt — это небольшая часть скорости; чем быстрее движется шайба, тем она больше. Вычитая эту часть в каждом кадре, ты быстро замедляешь быстро движущуюся шайбу и плавно — медленно движущуюся, пока она не остановится. Число больше 2 означает более шероховатую поверхность.

Если долго удерживать клавишу, сила толчка и трение уравновесятся, и шайба достигнет максимальной скорости 600 / 2 = 300 пикселей в секунду.

challenge icon

Задание

Средне
  1. В цикле замените vel = pygame.Vector2(0, 0) на acc = pygame.Vector2(0, 0) и задайте для каждой клавиши со стрелкой значение acc.x или acc.y равным 600 или -600.
  2. Перед перемещением шайбы прибавьте к vel значение acc * dt, а затем вычтите из него vel * 2 * dt.

Попробуйте сами

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

Все уроки раздела Игровой цикл

Потренируйтесь самостоятельно: Песочница Pygame