
파이썬 · 약 5분
pygame 키보드 입력: 원을 일정한 속도로 움직이기
키 이벤트와 지속 입력의 차이를 살펴보고, 시간 기반 이동·대각선 속도·창 경계를 처리하는 예제를 만듭니다.
Wolfgadeok · 업데이트
이벤트와 눌림 상태를 나누어 사용하기
원을 방향키로 움직일 때, 키를 누르거나 뗄 때마다 속도 변수만 바꾸면 동시 입력 처리가 꼬일 수 있습니다. 오른쪽을 누른 상태에서 왼쪽도 누른 뒤 한쪽만 떼면 어느 키가 남아 있는지 속도 변수 하나로 정확히 표현하기 어렵기 때문입니다. 지속 이동은 매 프레임 현재 키 상태를 읽고, 종료 같은 사건은 이벤트로 처리하면 구조가 명료해집니다.
pygame.event.get을 반복해서 처리해야 창이 운영체제와 계속 소통합니다. 키 상태만 읽고 이벤트 큐를 방치하면 종료를 놓치거나 응답 없음처럼 보일 수 있습니다. 공격 버튼처럼 짧은 눌림 순간이 중요한 동작은 상태 폴링이 아닌 KEYDOWN 등의 이벤트를 별도로 사용하는 편이 적합합니다. 이 글의 예제는 이동 실습에 범위를 한정합니다.
초 단위 dt와 정규화된 방향
Clock.tick이 반환하는 경과 시간은 밀리초이므로 1000으로 나누어 초로 바꿉니다. 이 값을 속도에 곱해야 프레임마다 경과한 시간만큼 이동합니다. 아래에서는 초당 240픽셀을 기준으로 움직이고, 대각선 입력을 정규화해 이동 속도가 빨라지지 않도록 합니다. 0.05초 제한은 긴 멈춤 이후 원이 크게 튀는 것을 줄이는 학습용 정책이며, 실제 게임의 시간 처리에는 별도 판단이 필요합니다.
예제 · python
import pygame
pygame.init()
screen = pygame.display.set_mode((960, 540))
clock = pygame.time.Clock()
position = pygame.Vector2(480, 270)
radius = 24
running = True
try:
while running:
dt = min(clock.tick(60) / 1000.0, 0.05)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if not running:
break
keys = pygame.key.get_pressed()
direction = pygame.Vector2(
int(keys[pygame.K_RIGHT]) - int(keys[pygame.K_LEFT]),
int(keys[pygame.K_DOWN]) - int(keys[pygame.K_UP]))
if pygame.key.get_focused() and direction.length_squared() > 0:
position += direction.normalize() * 240 * dt
position.x = max(radius, min(screen.get_width() - radius, position.x))
position.y = max(radius, min(screen.get_height() - radius, position.y))
screen.fill((245, 247, 255))
pygame.draw.circle(screen, (90, 110, 220),
(round(position.x), round(position.y)), radius)
pygame.display.flip()
finally:
pygame.quit()원 하나로 확인할 수 있는 입력 품질
실행 전에는 Python 환경에 pygame이 설치되어 있어야 합니다. 예제 창에 포커스를 둔 상태에서 방향키를 눌러 이동을 확인합니다. 화면 좌표를 정수로 바꾸는 것은 그릴 때만 수행하고, 내부 위치는 실수로 유지하여 작은 이동량을 버리지 않도록 합니다. 원의 반지름만큼 경계를 남겨 화면 밖으로 반쯤 사라지는 것도 막았습니다.
오른쪽과 왼쪽을 함께 누르면 수평 이동이 0이 되고, 한쪽을 떼면 남은 방향으로 움직이는지 확인하세요. 창을 다른 프로그램 뒤로 보냈을 때 정지하고 복귀 후 정상 작동하는지도 봅니다. tick 제한을 30과 60으로 바꾸었을 때 비슷한 속도가 유지되는지 비교하면 시간 기반 이동의 목적을 직접 확인할 수 있습니다.
예제 속도는 학습을 위한 값입니다. 실제 게임에서는 화면 해상도와 월드 단위를 구분하고 캐릭터 크기에 맞춰 이동 속도를 정합니다.
참고 자료
예제는 학습용이며, 모든 환경에서 실행 검증된 완성 프로젝트는 아닙니다. 적용 전 사용 중인 버전과 프로젝트 환경에서 동작을 확인하세요.