가속과 마찰
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픽셀에 도달합니다.
챌린지
중급- 루프에서
vel = pygame.Vector2(0, 0)을acc = pygame.Vector2(0, 0)으로 바꾸고, 각 방향키를 누르면acc.x또는acc.y가600또는-600이 되도록 하세요. - 퍽을 움직이기 전에
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 플레이그라운드