клавиатура опроса Pygame вне основного цикла событий - PullRequest
0 голосов
/ 14 января 2012

Хотелось бы узнать, как опрашивать клавиатуру в pygame не в главном цикле событий.

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

Вот код:


import sys, pygame
from pygame.locals import *
class test():
    pygame.init()
    pygame.font.init()
    screen=pygame.display.set_mode((768, 576))
    pygame.display.set_caption("test")
    clock = pygame.time.Clock()
    while True:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()
        if pygame.event.poll().type==pygame.KEYDOWN:
            print "a" 
        screen.fill((0,0,0))
        pygame.display.flip()

Ответы [ 2 ]

0 голосов
/ 14 января 2012

Ваш цикл for вызывает event.get (), который очищает очередь событий. Итак, после этого, который вы пытаетесь использовать event.poll (), вы, вероятно, просто получите NOEVENT, потому что очередь пуста. И event.poll () получит только одно событие, я думаю, первое событие в очереди. Таким образом, единственный способ получить событие KEYDOWN - это если это произошло во время прохождения цикла for через другие события, и между событием KEYDOWN и вызовом event.get () не произошло никакого другого события.

Мне не понятно, почему вы хотите избежать цикла обработки событий, но чтобы получить искомый результат, я бы изменил цикл for на оператор if, проверяющий pygame.event.get (pygame.QUIT) (вы только нужно знать, есть ли он), и оператор if для цикла в pygame.event.get (pygame.KEYDOWN) (в случае, если вам нужно обработать несколько ключей KEYDOWN). Затем добавьте вызов pygame.event.pump () для очистки любых других событий из очереди.

0 голосов
/ 14 января 2012

Ваш пример кода выглядит нормально - но он пропускает вызов do pygame.event.pump() внутри основного цикла. Попробуйте добавить такой вызов.

Кроме того, не должна ли ваша строка if pygame.event.poll() находиться внутри цикла for event? Как написано, он просто проверяет последнее доступное событие на наличие типа «клавиатура».

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

...