Pygame按住键会导致无限循环

2024-05-19 01:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个乒乓球游戏,在这个游戏中我可以用上下箭头来移动球拍。我创建了一个padle对象,每次按up键时更新一个给定的量(在下面的代码中作为参数“num”传递)。我要做的是允许用户按住向上按钮,这将导致桨叶不断向上移动。我试图在while循环中编写这个事件处理,但是我陷入了一个无限循环中。代码如下:

    for event in PE.get():
        if event.type == PG.KEYDOWN:
            keystate = PG.key.get_pressed()
            if event.key == PG.K_ESCAPE:
                done = True
            while keystate[PL.K_UP]:
                rightPaddle.update(-20)


        if event.type == PG.QUIT:
            done = True

以下是桨叶对象的代码:

^{pr2}$

我检查了关于这个主题的其他stackoverflow问题,这就是我如何找到PG.key.GET按下()方法,但其他答案建议使用“精灵”,我不知道如何使用。有谁能就如何执行这项任务提供一些建议吗?在


Tags: 对象key代码eventtrue游戏getif
2条回答

while循环的问题是它正在计算one keydown事件。该事件将始终是它开始时的任何形式,并且它在事件处理代码中没有更改的机会。你想抓的是PG键合随后发生的事件。所以你会有一些(逻辑上)类似的东西

if event.type == PG.KEYDOWN and keystate[PL.K_UP]:
    key_up_pressed = True
elif event.type == PG.KEYUP and keystate[PL.K_UP]:
    key_up_pressed = False

显然,您可以更好地考虑这一点,但是key_up_pressed状态将在主循环中每隔一段时间(帧、毫秒等)评估一次,然后移动挡板。在

在本规范中:

while keystate[PL.K_UP]:
    rightPaddle.update(-20)

…没有什么可以改变keystate。因此,如果keystate[PL.K_UP]一次为真,那么它将永远为真。因此产生了无限循环。在

您可以每次通过循环从pygame获取当前的密钥信息,这至少使它不是无限的,但这仍然意味着整个程序阻塞,直到用户释放密钥为止。在

如果不知道你打算写一个帧速率驱动的游戏还是一个事件循环驱动的游戏,我就不能确切地告诉你如何修正它。在

但不管怎样,关键的一点是,你不想一次次地移动,只要按住键,你就要以一定的速度移动,处理其间的其他事件。不管是哪种方式,您都将使用KEYDOWN和KEYUP事件来设置某种标志,告诉您移动挡板。然后,每帧一次,或使用计时器事件,或以其他方式,使用当前标志值来移动挡板。在

相关问题 更多 >

    热门问题