pygame
이벤트 처리
수색…
이벤트 루프
Pygame은 사용자의 모든 이벤트를 pygame.event.get()
코드와 함께 수신 할 수있는 이벤트 대기열에 등록합니다. 이 큐의 모든 요소는 Event
객체이며 모든 유형의 이벤트를 나타내는 정수형 인 속성 type
갖습니다. 파이 게임 모듈에는 유형을 나타내는 미리 정의 된 정수 상수가 있습니다. 이 속성을 제외하고 이벤트에는 다른 속성이 있습니다.
상수 | 속성 |
---|---|
떠나다 | 없음 |
활성 | 이득, 상태 |
키 다운 | 유니 코드, 키, 모드 |
키업 | 키, 모드 |
MOUSEMOTION | pos, rel, buttons |
마우스 단추 | 위치, 버튼 |
마우스 버튼 다운 | 위치, 버튼 |
조이 액스 모이 션 | 기쁨, 축, 가치 |
JOYBALLMOTION | 기쁨, 공, rel |
조이 탐 | 기쁨, 모자, 가치 |
JOYBUTTONUP | 기쁨, 버튼 |
기쁨 | 기쁨, 버튼 |
비디오 제작 | 크기, w, h |
비디오 텍스트 | 없음 |
사용자 | 암호 |
예
우리의 이벤트를 처리하기 위해 단순히 대기열을 순환하여 파이 게임 모듈의 미리 정의 된 상수를 사용하여 어떤 유형인지 확인한 다음 일부 작업을 수행합니다. 이 코드는 사용자가 디스플레이의 상단 모서리에있는 닫기 버튼을 눌렀는지 확인한 다음 프로그램 종료시 확인합니다.
for event in pygame.event.get():
if event.type == pygame.QUIT:
# Close the program any way you want, or troll users who want to close your program.
raise SystemExit
주의 : 파이 게임을 사용할 때 이벤트 큐를 정기적으로 호출해야합니다! 사용 가능한 이벤트를 가져 오는 것 외에 이벤트 큐를 호출하는 것은 운영 체제와 내부적으로 상호 작용하는 파이 게임의 방식이기도합니다. 이벤트 대기열이 정기적으로 호출되지 않으면 운영 체제는 프로그램이 더 이상 제대로 작동하지 않는다고 판단하여 프로그램이 손상된 것처럼 보일 수 있습니다 (Windows에서는 창이 흰색으로 바뀝니다). 이벤트에 아무 것도하고 싶지 않으면 pygame.event.pump()
호출하여 모든 게임 루프를 호출하여 파이 게임이 이벤트를 내부적으로 처리하도록해야합니다.
키보드 이벤트
: 파이 게임에서 키 이벤트의 두 가지 유형이 있습니다 KEYDOWN
와 KEYUP
. 이러한 이벤트에는 키보드의 키를 나타내는 정수인 속성 key
가 있습니다. 파이 게임 모듈에는 모든 공통 키를 나타내는 미리 정의 된 정수 상수가 있습니다. 상수는 대문자 K
, 밑줄 및 키 이름으로 이름이 지정됩니다. 예를 들어, <- 는 K_BACKSPACE
, a 는 K_a
, F4 는 K_F4로 K_F4
됩니다.
예
이 코드는 사용자가 w , a , s 또는 d를 눌렀는지 확인합니다.
for event in pygame.event.get():
if event.type == pygame.QUIT: # Usually wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
print("Player moved up!")
elif event.key == pygame.K_a:
print("Player moved left!")
elif event.key == pygame.K_s:
print("Player moved down!")
elif event.key == pygame.K_d:
print("Player moved right!")
수정 자
대문자에는 정수 상수가 없습니다. 대신 키 이벤트에는 mod
라는 다른 속성이 있습니다.이 키는 동시에 키로 눌려지는 수정 자 ( Shift , Ctrl , Alt 등)입니다. mod
속성은 눌려진 수정자를 나타내는 정수입니다. 각 수정 자의 정수 값은 KMOD_
이름과 그 이름으로 파이 게임 모듈에 저장됩니다. 예를 들어 왼쪽 시프트 는 KMOD_LSHIFT
, 탭 은 KMOD_TAB
, Ctrl 은 KMOD_CTRL
입니다.
예
이 코드는 사용자가 a , Left shift + a 또는 Caps + a를 눌렀는지 확인 합니다 .
for event in pygame.event.get():
if event.type == pygame.QUIT: # It's still wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if event.mod == 0: # No modifier.
print("You pressed 'a'")
elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
print("You pressed 'A'")
else:
print("You pressed 'a' with another modifier than right shift or caps.")
마우스 이벤트
pygame MOUSEMOTION
, MOUSEBUTTONDOWN
및 MOUSEBUTTONUP
에는 세 가지 유형의 마우스 이벤트가 있습니다. 파이 게임은 디스플레이 모드가 설정되면 이러한 이벤트를 등록합니다.
MOUSEMOTION
은 사용자가 자신의 마우스를 디스플레이에서 움직일 때 수신됩니다. buttons
, pos
및 rel
속성이 있습니다.
-
buttons
은 마우스 버튼 (left
,mouse-wheel
,right
)이 눌려지고 있는지를 나타내는 튜플입니다. -
pos
는 커서의 절대 위치 (x
,y
)입니다 (픽셀 단위). -
rel
은 이전 위치 (rel_x
,rel_y
)에 상대적인 위치 (픽셀 단위)입니다.
MOUSEBUTTONDOWN
및 MOUSEBUTTONUP
은 사용자가 마우스 버튼을 눌렀거나 놓을 때 수신됩니다. 속성 button
과 pos
있습니다.
-
button
은 눌려진 버튼을 나타내는 정수입니다. 왼쪽 버튼1
개, 마우스 휠 23
, 오른쪽 버튼3
. -
pos
는 사용자가 마우스 버튼을 눌렀을 때 마우스 (x
,y
)의 절대 위치입니다.
예
다음은 각 마우스 이벤트의 속성 중 일부를 사용하는 간단한 예입니다.
for event in pygame.event.get():
if event.type == pygame.QUIT: # Close your program if the user wants to quit.
raise SystemExit
elif event.type == pygame.MOUSEMOTION:
if event.rel[0] > 0: # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
print("You're moving the mouse to the right")
elif event.rel[1] > 0: # pygame start y=0 at the top of the display, so higher y-values are further down.
print("You're moving the mouse down")
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
print("You pressed the left mouse button")
elif event.button == 3:
print("You pressed the right mouse button")
elif event.type == pygame.MOUSEBUTTONUP:
print("You released the mouse button")
파이 게임 모듈에는 마우스 버튼 속성에 대해 미리 정의 된 상수가 없으므로 각 값은 다음과 같습니다.
단추 | 값 |
---|---|
마우스 왼쪽 버튼 | 1 |
마우스 휠 버튼 | 2 |
마우스 오른쪽 버튼 | 삼 |
마우스 휠 위로 스크롤 | 4 |
마우스 휠이 아래로 스크롤됩니다. | 5 |
마우스 버튼을 스크롤하면 pygame.MOUSEBUTTONDOWN
및 pygame.MOUSEBUTTONUP
이벤트가 생성됩니다.
상태 확인
pygame.key
와 pygame.mouse
모듈에서 함수를 호출하여 키와 마우스의 상태를받을 수 있습니다. 그러나 파이 게임에서 몇 가지 결함이 있기 때문에 이벤트를 처리하는 것은 권장 된 방법이 아닙니다.
함수가 호출 될 때 상태를받습니다. 즉, 사용자가 버튼을 빠르게 누르면 호출간에 이벤트가 누락 될 수 있습니다.
이벤트의 순서를 결정할 수는 없습니다.
파이 게임이 내부적으로 운영체제와 상호 작용할 수 있도록 파이 게임의 이벤트 함수 중 하나를 호출해야합니다. 그렇지 않으면 프로그램이 응답하지 않는다고 경고합니다. 호출 할 수있는 함수는 다음과 같습니다.
-
pygame.event.get()
을 사용하여 모든 이벤트 또는 이벤트 유형 (유형을 인수로 전달하여)을 큐에서 가져옵니다. -
pygame.event.poll()
대기열에서 하나의 단일 이벤트를 가져옵니다. -
pygame.event.wait()
대기열에서 하나의 단일 이벤트를 기다립니다. -
pygame.event.clear()
를 사용하여 큐의 모든 이벤트를 지 웁니다. -
pygame.event.pump()
pygame이 내부 동작을 처리하도록합니다 (위의 함수에 의해 암시 적으로 호출 됨).
-
키보드 이벤트
키 모듈에는 모든 키의 상태 목록을 반환하는 pygame.key.get_pressed()
함수가 있습니다. 이 목록에는 포함 0
누를되지 않은 모든 키 1
을 누르면 모든 키에 대한합니다. 목록의 색인은 pygame 모듈의 상수로 정의되며 모두 앞에 K_
와 키 이름이 붙습니다.
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
print("You pressed 'a'")
if key[pygame.K_F1]:
print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
print("You pressed 'left shift'")
if key[pygame.K_q]: # Press 'q' to exit the program
quit()
키를 누르고있는 대신 하나의 키 누름을 확인하려면 모든 키의 이전 상태를 임시 변수에 저장하고 값이 변경되는지 확인하십시오.
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
print("You pressed 'p'")
previous_key = key
이 명령문은 현재 키가 눌려지고 이전 키가 눌러지지 않은 경우에만 true로 평가됩니다. 사용자가 키를 if not key[pygame.K_q] and previous_key[pygame.K_q]
하려면 not
키워드 ( if not key[pygame.K_q] and previous_key[pygame.K_q]
만 전환하면됩니다. 올바르게 작동하려면 게임 루프 전에 previous_key = pygame.key.get_pressed()
변수를 설정해야합니다. 그렇지 않으면 NameError
수신됩니다.
마우스 이벤트
마우스 모듈에는 마우스의 위치를 확인하고 설정할 수있는 기능과 버튼을 눌렀는지 확인하는 기능이 있습니다. pygame.mouse.get_pressed()
함수는 마우스 버튼 (왼쪽, 마우스 휠, 오른쪽)이 눌려지고 있는지를 나타내는 튜플 튜플을 반환합니다.
pygame.event.pump() # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
pygame.mouse.set_pos(10, mouse_pos[1]) # Reset the mouse's x-position to 10.
print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
print("I'm right, right?")
if mouse_buttons[0]: # Press left mouse button to exit.
print("Program left")
quit()