Очередь событий Pygame

Я хотел бы знать, есть ли способ использовать poll() или get() не удаляя события из очереди.

В моей игре я проверяю ввод в разных местах (не только в основном цикле), а иногда мне нужно проверять одно и то же событие в разных местах, но когда я его проверю, как только он удалит его из очереди. Я попытался использовать peek() но проблема в том, что я не могу получить ключ, соответствующий выполняемому событию.

 while 1: event = pygame.event.poll() if event.type == KEYDOWN: return event.key else: pass #works but removes event from the queue 

Это может получить ключ, соответствующий событию, но с помощью peek() он не может:

 pygame.event.peek(pygame.KEYDOWN).key #dosent work 

Однако я не могу использовать первый метод, потому что удаляет событие из очереди, поэтому я не могу проверять ключевые события в другом месте программы.
Я не понимаю, как работает queue поэтому, возможно, я просто ошибаюсь, но я попробовал первый в другом месте и только в первый раз, когда я проверил событие, в котором он работал.

Моя цель – проверить события в разных классах в моей игре.

Спасибо за вашу помощь

Я думаю, что лучший дизайн будет проверять события в одном месте – даже если в факторизованной функции или методе вне кода mainloop и хранить все данные события eventnt в других объектах (как атрибутах) или переменных.

Например, вы можете сохранить ссылку на набор Python со всеми текущими нажатыми клавишами, текущую позицию мыши и состояние кнопки и передать эти переменные вокруг функций и методов.

В противном случае, если вам нужно проверить только нажатые клавиши и состояние мыши (и положение указателя), вы можете полностью обходить события (только сохраняя вызовы pygame.event.pump () на mainloop). Функция pygame.key.get_pressed – мой любимый способ чтения клавиатуры – она ​​возвращает последовательность с таким количеством позиций, что и коды клавиш, и каждая нажатая клавиша имеет соответствующее положение, установленное на True в этом векторе. (Коды ключей доступны как константы в pygame.locals, такие как K_ESC, K_a, K_LEFT и т. Д.).

Пример:

 if pygame.key.get_pressed()[pygame.K_ESCAPE]: pygame.quit() 

Модуль мыши (задокументированный в http://www.pygame.org/docs/ref/mouse.html ) позволяет вам получить состояние мыши без использования событий.

И, наконец, если вы действительно хотите получать события, я вижу, что это возможность перевести события в очередь, если они не будут уничтожены, с вызовом pygame.event.post – этот вызов можно разместить, например, в предложении else в последовательности if / elif, где вы проверяете какое-либо состояние в очереди событий.

Я не знаю, хороший ли это стиль, но я просто сохранил все события в переменной и передал их объектам, которые использовали собственные очереди событий для обнаружения «своих» событий.

 while running: events = pygame.event.get() for event in events: if event.type == pygame.QUIT: running = False self.allS.update(events) 

и в методе обновления:

 for event in events: print("Player ", event)