Menu
CoddyTech

가속과 마찰

Coddy Pygame 여정의 게임 루프 섹션에 포함된 레슨. 32개 중 21번째.

퍽은 처음에 최고 속도로 움직이다가 손을 놓으면 바로 멈춥니다. 얼음 위에서는 속도가 점점 빨라지고 미끄러져야 합니다. 두 가지를 바꾸면 됩니다.

가속도는 속도가 매초 초당 픽셀 단위로 얼마나 빠르게 변하는지를 뜻합니다. 키를 누르면 가속도가 설정되고, 가속도에 따라 속도가 변합니다.

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

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

키를 누르지 않았을 때 가속도가 0이 되도록 매 프레임마다 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. 퍽을 움직이기 전에 acc * dt를 vel에 더한 다음, 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 플레이그라운드