我正在使用Python 3.7创建游戏启动器,并且正在使用Pygame(“ pg”)库。我为可点击的文本(“链接”)创建了一个类,并且有一个事件处理程序可以检查pg.QUIT函数。
我建立了一个while循环,该循环从检查pg.QUIT的事件处理函数开始,然后在循环中,我有一个类函数,该函数侦听链接是否被单击。
不幸的是,当它们都能够在循环中运行时,它们会相互干扰,并且某些输入会被忽略,例如pg.MOUSEBUTTONDOWN(在这里至关重要)。
我尝试禁用事件处理程序(我刚刚在调用它的行中添加了注释),并使它起作用。每个输入都被注册。但是,我不想在对象类中检查pg.QUIT,也不想在事件处理程序中查找特定的对象:我想将这些东西分开。
我班上的代码如下:
(Inside TextObject class)
def link():
for e in pg.event.get():
if e.type == pg.MOUSEBUTTONDOWN and {mouse is over link}:
print('click!')
事件处理程序中的代码如下:
def handle():
for e in pg.event.get():
if e.type == pg.QUIT:
running = False
while循环中的代码如下:
while running:
handle()
{update screen and draw text}
textObject.link()
clock.tick(fps)
我希望程序监听pg.QUIT,然后如果还没有发生,请继续并监听链接是否被单击。
当我运行它时,该程序仅打印“单击!”。单击链接大约二十次后。似乎几乎是随机的。
我预计这两个功能会互相干扰,我可以通过某种联合功能对其进行修复,但我真的更希望保留这两个功能的模糊性不用在某些文本坐标中进行硬编码,知道吗?
谢谢。
P.S。我使用伪代码提供了一些上下文,但是我已经确认问题出在我明确编写的代码中。
答案 0 :(得分:2)
将 all 事件处理移入主循环。您正在丢失事件,因为某些事件是在一个循环中处理(并丢弃未处理的事件),类似地在另一个事件循环中处理,但对于其他事件类型。
将事件处理扩展到代码的各个部分,使逻辑和调试更加困难。理想情况下,在单个位置处理单个逻辑项效果很好。因此,当您遇到用户输入问题时,只需调试用户输入部分-而不是 this-function , that-function 和这是文件中的东西。
当然,如果需要查看按下了哪个按钮或执行任何操作,请编写一个函数来执行此操作,然后在单击事件处理期间调用该函数(将其传递到鼠标位置)。
while running:
# Handle user input
for e in pg.event.get():
if e.type == pg.QUIT:
running = False
elif e.type == pg.MOUSEBUTTONDOWN:
if {mouse is over link}:
print('click!')
# Handle screen painting
...