event 처리 및 key event > Pygame - python GUI module

본문 바로가기
사이트 내 전체검색

회원로그인

올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구

Pygame - python GUI module

event 처리 및 key event

페이지정보

글쓴이 관리자 조회 43,947 조회 날짜 20-02-21 17:46 / Update:20-02-28 12:08
댓글 0 댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

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:
            playing = False
            pygame.quit()

 

        # 키가 눌렸을 때

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("왼쪽 키 눌림")
            if event.key == pygame.K_RIGHT:
                print("오른쪽 키 눌림")

            if event.key == pygame.K_UP:
                print("위로 키 눌림")
            if event.key == pygame.K_DOWN:
                print("아래로 키 눌림")

 

        # 키가 떼졌을 때
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                print("왼쪽 키 떼짐")
            if event.key == pygame.K_RIGHT:
                print("오른쪽 키 떼짐")

            if event.key == pygame.K_UP:
                print("위로 키 떼짐")
            if event.key == pygame.K_DOWN:
                print("아래로 키 떼짐")

 

 

    # fps 설정, while 구문안에 넣는다.

    clock.tick(60)

 

 

 

실행화면

 

2921044682_1582331987.133.png

 

화살표를 눌렀을 때, console 화면

 

2921044682_1582332301.1032.png

댓글목록 sfs

총 22 건 , 1 페이지
게시물 검색
Pygame - python GUI module 목록
번호 제목 글쓴이 조회 날짜
1 관리자 61477 02-21
2 관리자 34048 02-21
열람중 관리자 43948 02-21
4 관리자 47552 02-22
5 관리자 50441 02-22
6 관리자 44877 02-22
7 관리자 38384 02-22
8 관리자 39152 02-22
9 관리자 40696 02-23
10 관리자 47096 02-24
11 관리자 34509 02-25
12 관리자 37998 02-27
13 관리자 31233 03-05
14 관리자 38346 03-10
15 관리자 25910 03-10
16 관리자 31453 03-11
17 관리자 24678 03-11
18 관리자 27012 03-11
19 관리자 30513 03-11
20 관리자 33097 03-11
21 관리자 33946 04-05
22 관리자 27025 04-05
GNUBOARD_M
Copyright © JBMPA.com All rights reserved.