pygame.event.get() 未能在单独的线程中返回事件
此查询与使用 pygame.event 时遇到的困难有关.get() 在一个单独的线程中,用于管理吃豆人启发的游戏中的用户输入。负责接收输入的代码片段如下:
def receiving_inputs(self): while True: events = pg.event.get() for event in events: if event.type == pg.KEYDOWN: if event.key == pg.K_UP: self.move = 'n' elif event.key == pg.K_RIGHT: self.move = 'e' elif event.key == pg.K_DOWN: self.move = 's' elif event.key == pg.K_LEFT: self.move = 'w' time.sleep(1/60) threading.Thread(target=self.receiving_inputs).start()
执行此代码时,按下键盘按键不会触发任何事件,而移动鼠标会返回事件。有趣的是,当在程序的主循环而不是单独的线程中执行时,相同的代码可以完美地运行。
这个问题源于希望通过使用单独的线程来最大限度地减少主循环中未注册的按键实例.
解决方案:
意外行为源于以下事实事件必须在主线程内管理。如 pygame.event 文档中所述:
[...] 事件子系统应该从主线程调用。
虽然从单独的线程发布事件是可行的,但事件队列只能由主线程处理。因此,
确保在主线程中获取事件:
def receiving_inputs(self): while True: events = pg.event.get() for event in events: ...
创建一个线程,根据事件修改游戏状态事件:
def move(self, move): ... thread = threading.Thread(target=self.move, args=(move,)) thread.start()
以上是为什么`pygame.event.get()`无法在单独的线程中返回事件?的详细内容。更多信息请关注PHP中文网其他相关文章!