我想知道如何在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()
答案 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()调用以清除队列中的任何其他事件。