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

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

4 голосов
/ 15 января 2012

Я хотел бы знать, есть ли способ использования 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, так что, возможно, я просто ошибаюсь, но я попробовал первый в другом месте и только в первый раз, когда я проверил событие, которое оно работало.

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

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

Ответы [ 2 ]

2 голосов
/ 15 января 2012

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

Например, вы можете сохранить ссылку на набор 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, где вы проверяете какое-либо состояние в очереди событий.

0 голосов
/ 19 января 2014

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...