pygame poll键盘出主事件循环

时间:2012-01-14 01:13:27

标签: python events keyboard pygame

我想知道如何在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 :(得分:0)

您的示例代码看起来很好 - 但它缺少在mainloop中调用pygame.event.pump()。尝试添加这样的电话。

此外,您的if pygame.event.poll()行不应该在for event循环中吗?它的编写方式,只是检查最后一个可用的事件是否为“键盘”类型。

除此之外,没有任何东西阻止你调用pygame.event.poll从main循环代码中获取键盘事件,在主循环中调用的任何函数或方法(并且它本身有一个子循环)

答案 1 :(得分:0)

你的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()调用以清除队列中的任何其他事件。