목표를 향해 이동하기
Coddy Pygame 여정의 사운드와 게임의 손맛 섹션에 포함된 레슨. 23개 중 16번째.
클릭하면 원이 그곳으로 순간 이동합니다. 제자리로 미끄러져 가는 물체가 더 보기 좋습니다. 처음에는 빠르게 움직이다가 점점 느려지며 제자리에 부드럽게 안착합니다. 한 줄이면 이렇게 움직일 수 있습니다. 매 프레임 남은 거리의 일부만큼 이동하세요.
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x는 앞으로 이동해야 하는 거리입니다. 그 거리의 10분의 1만큼 이동하면 첫 프레임에 200픽셀 거리 중 20픽셀을 이동합니다. 다음 프레임에는 180픽셀이 남으므로 18픽셀, 그다음에는 16.2픽셀을 이동하는 식입니다. 원이 가까워질수록 이동 거리가 줄어들어, 갑자기 멈추는 대신 서서히 속도가 줄어듭니다.
이를 흔히 선형 보간의 줄임말인 lerp라고 부릅니다. 비율에 따라 움직임의 느낌이 달라집니다. 0.1은 부드럽고, 0.3은 경쾌하며, 0.02는 느리고 둥실거립니다. 목표 지점에 정확히 도달하지는 않지만, 1초가 지나면 1픽셀보다 가까워지므로 눈에 보이지 않습니다.
x와 y는 각각 별도의 변수에 소수점이 있는 숫자로 저장하세요. Rect는 정수만 저장하므로 0.4픽셀만큼 이동하려고 하면 그 값이 0으로 잘려 목표 지점에 도달하기 전에 움직임이 멈춥니다.
챌린지
쉬움원이 클릭할 때마다 순간이동합니다. 원이 부드럽게 움직이도록, x = target_x와 y = target_y를 각 프레임마다 x와 y를 목표 지점까지의 거리 중 10분의 1만큼 이동시키는 코드 줄로 바꾸세요.
직접 해보기
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()
x, y = 240, 180
target_x, target_y = 240, 180
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
target_x, target_y = event.pos
x = target_x
y = target_y
screen.fill((30, 30, 46))
pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
pygame.display.flip()
clock.tick(60)
pygame.quit()
사운드와 게임의 손맛의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드