2012-01-14 2 views
4

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

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

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

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

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

Ex:

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

ОК спасибо за ваш ответ так что я буду иметь один основной цикл и отправить событие, как и аргументы для моих других функций. Также, как работает почта? Я читаю документацию, но я не могу это понять. – John

0

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

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) 
Смежные вопросы