Python Pygame事件处理程序是否相互干扰?
我正在用Python3.7制作一个游戏启动器,并使用Pygame(“pg”)库。我为可点击文本(“链接”)创建了一个类,我有一个事件处理程序来检查pg.QUIT函数 我设置了一个while循环,该循环从检查pg.QUIT的事件处理程序函数开始,然后在循环中,我有一个类函数来侦听链接是否被单击 不幸的是,当它们都能够在循环中运行时,它们相互干扰,一些输入被忽略,例如pg.MOUSEBUTTONDOWN(这在这里很重要) 我尝试过禁用事件处理程序(我只是对调用它的行进行了注释),这使它能够工作;每个输入都已注册。但是,我不想在对象类中检查pg.QUIT,也不想在事件处理程序中查找特定对象:我想将这些对象分开 我班上的代码如下:Python Pygame事件处理程序是否相互干扰?,python,pygame,Python,Pygame,我正在用Python3.7制作一个游戏启动器,并使用Pygame(“pg”)库。我为可点击文本(“链接”)创建了一个类,我有一个事件处理程序来检查pg.QUIT函数 我设置了一个while循环,该循环从检查pg.QUIT的事件处理程序函数开始,然后在循环中,我有一个类函数来侦听链接是否被单击 不幸的是,当它们都能够在循环中运行时,它们相互干扰,一些输入被忽略,例如pg.MOUSEBUTTONDOWN(这在这里很重要) 我尝试过禁用事件处理程序(我只是对调用它的行进行了注释),这使它能够工作;每个
(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 running:
handle()
{update screen and draw text}
textObject.link()
clock.tick(fps)
我的事件处理程序中的代码如下所示:
(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 running:
handle()
{update screen and draw text}
textObject.link()
clock.tick(fps)
我的while循环中的代码如下所示:
(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 running:
handle()
{update screen and draw text}
textObject.link()
clock.tick(fps)
我想让程序监听pg.QUIT,如果没有,继续收听,看看链接是否被点击
当我运行它时,程序只打印“单击!”在我点击链接20次之后。这几乎是随机的
我预测这两个函数相互干扰,我可以用某种联合函数来修复它,但我真的更喜欢保持这些函数的模糊性,而不在某些文本坐标中进行硬编码,你知道吗
谢谢
另外,我使用伪代码给出了一些上下文,但我已经确认问题在于我明确编写的代码。将所有事件处理移到主循环中。您正在丢失事件,因为某些事件正在一个循环中处理(并丢弃未处理的事件),而在另一个事件循环中也是如此,但对于其他事件类型
将事件处理扩展到代码的各个部分会使逻辑和调试更加困难。理想情况下,在单个位置处理单个逻辑项效果良好。因此,当用户输入出现问题时,只需调试用户输入部分,而不需要调试该函数、该函数和文件中的这个东西
当然,如果您需要查看按下了哪个按钮或其他什么,请编写一个函数来执行此操作,然后在单击事件处理期间调用该函数(将鼠标位置传递给它)
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
...
嘿,这清理了代码很多,它的工作以及!最后我不得不重新调整对象的位置处理方式,但效果很好,谢谢!