event 처리 및 key event
페이지정보
내용
event 처리 및 key event
게임같은 프로그램은 항상 사용자의 입력을 기다린다.
사용자가 키보드를 누르거나 마우스를 움직이거나 조이스틱을 움직이면, 이 입력값을 받아서 처리한다.
이러한 사용자의 입력이 생기는 것을 event라 부른다.
예를 들어, 키보드의 "A"키를 눌렀다가 뗀다고 한다면
1. 키보드가 눌렸다.
2. 눌린 키는 "A"이다.
3. "A" 키가 다시 올라갔다.
등등의 이벤트가 발생하게 된다.
우리가 알지 못하는 사이 프로그램은 키보드, 마우스 등의 많은 입력 장치들로부터 이벤트가 발생하기를 기다리며, 발생된 이벤트를 처리한다.
1. event 가져오기
사용자로부터 발생한 이벤트는 큐에 저장된다. 그리고 큐에 저장된 이벤트를 꺼내어서 하나씩 처리하게 된다.
pygame에서는 evnet객체의 event.get() 메서드를 통하여 큐에 저장된 이벤트 리스트를 꺼내어서 사용한다.
이벤트 리스트를 얻는 코드 : pygame.event.get()
큐에 저장된 이벤트를 얻은 결과는 리스트이므로 for 문을 이용하여 하나씩 처리한다.
for event in pygame.event.get(): ''' 코드 ''' |
2. event type 체크하기
이벤트 큐에서 꺼내온 이벤트를 사용하기 위해서는 꺼내온 이벤트가 어떤 종류인지를 파악해야 한다.
이것을 이벤트의 type이라고 하는데, pygame에서 사용하는 event.type은 아래와 같다.
Event Type | 동작 | specific attributes |
QUIT | 윈도우의 x 버튼, 창 닫기 버튼 눌림 | none |
ACTIVEEVENT |
마우스가 화면에 들어가거나 나가면 발생
gain : 0 - 마우스가 화면에 들어올때 gain : 1 - 마우스가 화면에서 나갔을 때
state : 1 - 창이 활성화 state : 2 - 창이 비활성화 state : 6 - 비활성화된 창이 활성화 될때 |
gain, state |
KEYDOWN | 키가 눌렸을 때 | key, mod, unicode, scancode |
KEYUP | 키가 올라갔을 때 | key, mod |
MOUSEMOTION | 마우스 움직일때 | pos, rel, buttons |
MOUSEBUTTONUP | 마우스 버튼 뗄 때 | pos, button |
MOUSEBUTTONDOWN | 마우스 버튼 눌렀을 때 | pos, button |
JOYAXISMOTION | 조이스틱 축이 변경될 때 | joy, axis, value |
JOYBALLMOTION | 조이스틱 볼이 움직일 때 | joy, ball, rel |
JOYHATMOTION | 조이스틱 hat이 변경될 때 | joy, hat, value |
JOYBUTTONUP | 조이스틱 버튼 뗄 때 | joy, button |
JOYBUTTONDOWN | 조이스틱 버튼 눌렀을 때 | joy, button |
VIDEORESIZE | pygame.display.set_mode(size, mode)에서 mode를 pygame.RESIZABLE 일 경우. 윈도우 창 크기 변경 될 때 |
size, w, h |
VIDEOEXPOSE | 화면에 직접 그리는 하드웨어 디스플레이는 창의 일부를 다시 그려야 할 때 pygame.VIDEOEXPOSE 이벤트를 받음 | none |
USEREVENT | 사용자 설정 이벤트 | code |
출처 : https://www.pygame.org/docs/ref/event.html
QUIT 이벤트는 윈도우의 x 버턴을 눌렀을 때 발생한다. 즉, QUIT 이벤트가 발생했다면 프로그램을 종료시킨다.
이벤트가 QUIT 라면 아래와 같이 작성한다.
for event in pygame.event.get():
if event.type == pygame.QUIT: pygame.quit()
|
### 이벤트 처리 구문은 실질적으로는 모두 게임 루프안에서 코딩되어야 한다.
3. event 중 키보드 입력 처리하기
키보드의 화살표를 처리하는 코드를 만들어보자.
키보드를 타이핑할때는 키를 항상 누르고 있는 것이 아니다. 눌렀다 뗐다를 반복한다.
따라서 키보드 이벤트는 KEYDOWN, KEYUP 두 가지의 type을 모두 체크하여 처리해준다.
그리고 KEYDOWN 이벤트에서 눌린 키가 어떤 것인지를 확인해야 한다. 눌린 키는 event.key 를 통해 확인할 수 있다.
만약 키보드의 좌, 우, 위, 아래 화살표를 눌렀을 때, 어떤 동작을 하고 싶다면,
K_LEFT, K_RIGHT, K_UP, K_DOWN 네 개의 event.key를 사용할 수 있다.
더 많은 키 상수(constants)는 아래의 링크에서 확인한다.
pygame key : https://www.pygame.org/docs/ref/key.html
화살표 키가 눌리거나 떼는 이벤트가 발생했을 때 처리해주는 코드
for event in pygame.event.get():
if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: print("왼쪽 키 눌림")
if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: print("왼쪽 키 떼짐")
|
위의 코드를 응용하면 네 방향의 화살표 키를 누르고 뗄때의 이벤트에 대한 코드를 모두 작성할 수 있다.
4. 눌려있는 키 체크
어떤 경우 키를 계속 누르면서 동작을 지시해야 하는 경우가 있다.
이때 눌려있는 모든 키의 상태를 얻는 key 메서드를 이용하여 이를 처리할 수 있다.
pygame.key.get_pressed() -> (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
while True: keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]: print("스페이스 키 눌림") |
출처 : https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed
4. 게임루프, 이벤트 처리가 완료된 전체 코드
import pygame
# 전체 스크린의 가로, 세로 크기 설정 SCREEN_WIDTH = 400 SCREEN_HEIGHT = 500
# 초기화 pygame.init()
# 스크린 생성 SCREEN = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
# window의 타이틀 설정 pygame.display.set_caption("pygame test")
# Clock 객체 생성 clock = pygame.time.Clock()
playing = True
while playing:
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 키가 눌렸을 때 if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP:
# 키가 떼졌을 때 if event.key == pygame.K_UP:
# fps 설정, while 구문안에 넣는다. clock.tick(60)
|
실행화면
화살표를 눌렀을 때, console 화면