파이게임 이벤트가 대기 중입니다 | 이런 실수 하지마
pumps
"에서 가장 제안하는 방식인 대기열에 저장되며 모든 메시지를 제거합니다.파이게임을 시작하다
이벤트 보기를 시작하기 위해 반드시 전체boilerplate가 필요하지는 않습니다. 단지
pygame.init()
만 있으면 되고 모든 키 입력을 캡처하려면 캡처할 창이 필요하므로 디스플레이가 실행되어야 합니다.import pygame pygame.init() pygame.display.set_mode((854, 480))
이벤트 받기
pygames normal
event.get
메서드를 사용하여 이벤트를 가져옵니다.events = pygame.event.get()
이벤트를 인쇄하면 이것을 알 수 있습니다.
[
<Event(1541-JoyDeviceAdded {'device_index': 0, 'guid': '030000005e0400008e02000010010000'})>,
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 0})>,
<Event(4352-AudioDeviceAdded {'which': 1, 'iscapture': 0})>,
<Event(4352-AudioDeviceAdded {'which': 2, 'iscapture': 0})>,
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 1})>,
<Event(4352-AudioDeviceAdded {'which': 1, 'iscapture': 1})>,
<Event(32774-WindowShown {'window': None})>,
<Event(32777-WindowMoved {'x': 535, 'y': 302, 'window': None})>,
<Event(32770-VideoExpose {})>,
<Event(32776-WindowExposed {'window': None})>,
<Event(32788-WindowTakeFocus {'window': None})>,
<Event(32768-ActiveEvent {'gain': 1, 'state': 1})>,
<Event(32785-WindowFocusGained {'window': None})>,
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(771-TextInput {'text': 'a', 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(771-TextInput {'text': 'f', 'window': None})>,
<Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(771-TextInput {'text': 'f', 'window': None})>,
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(771-TextInput {'text': 'a', 'window': None})>,
<Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(771-TextInput {'text': 'f', 'window': None})>,
<Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(771-TextInput {'text': 'a', 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(771-TextInput {'text': 'f', 'window': None})>,
<Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(771-TextInput {'text': 'f', 'window': None})>,
<Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(771-TextInput {'text': 's', 'window': None})>,
<Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(771-TextInput {'text': 'd', 'window': None})>,
<Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,
<Event(768-KeyDown {'unicode': '', 'key': 1073742051, 'mod': 1024, 'scancode': 227, 'window': None})>,
<Event(772-Unknown {})>,
<Event(769-KeyUp {'unicode': '', 'key': 1073742051, 'mod': 0, 'scancode': 227, 'window': None})>,
<Event(32768-ActiveEvent {'gain': 0, 'state': 1})>,
<Event(32786-WindowFocusLost {'window': None})>,
<Event(772-Unknown {})>
]
좀 더 많은 이벤트를 가져옵니다.
게임의 여러 위치에서 이벤트를 요청하는 다중 파일 스프라이트가 있다고 가정해 보겠습니다. 게임 루프가 매우 빠르게 실행되고 이벤트가 차례로 발생한다고 가정하면 두 번째 이벤트에는 이벤트가 없습니다.
events_one = pygame.event.get() events_two = pygame.event.get()
이벤트를 인쇄하면 이벤트가 없음을 알 수 있습니다.
[]
일을 더 미치게 만드는
단순한 게임도 무한히 빠르게 실행되지는 않습니다. 약간의 지연이 있습니다. 이 지연으로 인해 대부분의 이벤트는 event_one으로 이동하고 event_one과 2 사이의 짧은 시간에 발생하는 모든 이벤트는 event_two의 대기열에 있게 됩니다.
import time events_one = pygame.event.get() time.sleep(.05) # simulating some delay that would naturally occur events_two = pygame.event.get()
해결 방법
각 프레임의 이벤트를 메모리에 저장합니다.
펌프
나는
pump=False
가 내가 찾던 답이 될 것이라고 생각했지만 내가 틀렸다는 것이 증명되었습니다. 그것은 나에게 직관적으로 행동하지 않습니다.events_one = pygame.event.get(pump=False) events_two = pygame.event.get(pump=False) events_three = pygame.event.get()
events_one
및 events_three
에는 이벤트 목록이 있지만events_two
는 비어 있습니다. pump=False
가다음
event.get()
에 대한 이벤트가 있지만 누구에게나 삭제된 것으로 나타납니다.event.get(pump=False)
.게임 상태 유지
오브젝트가 메인 게임 외부에서 자체 이벤트 처리를 수행하도록 하려면 이벤트가 포함된 일부 게임 상태를 오브젝트에 제공해야 합니다. 어떻게 결정하든 게임 루프당 한 번만
event.get()
를 호출할 수 있습니다. 그렇지 않으면 이상한 일이 발생합니다.
Reference
이 문제에 관하여(파이게임 이벤트가 대기 중입니다 | 이런 실수 하지마), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/waylonwalker/pygame-events-are-queued-dont-make-this-mistake-4h6k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)