Pygame - 按键上/下行为

Pygame - Key UP / DOWN behaviour

我试图通过使用 KEY DOWN 和 UP 来理解 "weird" pygame 行为。 我一直按下 "up arrow" 但我从 KEY UP 得到事件...

下面你可以看到我的代码:

import pygame
import sys
import speed

pygame.init()
pygame.display.set_mode((1, 1))

lastKey = 'z'

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                speed.Forward()
                lastKey = 'f'
            elif event.key == pygame.K_DOWN:
                speed.Backward()
                lastKey = 'b'
            else:
                lastKey = 'z'
                pass

        if event.type == pygame.KEYUP:
            if lastKey != 'z':
                speed.Stop()

结果如下:

按下"up arrow"...

Forward
Stop
Forward
Stop
Forward
Stop
Forward
Stop

发布了"up arrow"

我做错了什么?

谢谢!

如果您对此有疑问:
您的问题出在变量 lastKey 中的字符串中。我已经修改了你的调试代码,所以我没有使用速度函数和导入 speed 模块,而是让它打印一些东西。对于您的 pygame.KEYUP 活动,我做到了 print lastKey。这是修改后的代码:

import pygame
import sys


pygame.init()
pygame.display.set_mode((1, 1))

lastKey = 'z'

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                print 'Forward'
                lastKey = 'f'
            elif event.key == pygame.K_DOWN:
                print 'Backward'
                lastKey = 'b'
            else:
                lastKey = 'z'
                pass

        if event.type == pygame.KEYUP:
            if lastKey == 'z':
                print 'Stopped'
                print lastKey

显示结果时,我发现您的错误在 else 部分。当您执行该代码时,该代码仅在用户按下 K_UPK_DOWN 以外的任何其他键时激活。因此,它从未真正将您的变量重置回 z。我想当 lastKey 等于 z 时,您想要执行 speed.Stop()(在您的情况下),我将最后的 if 行更改为:

if lastKey == 'z':

现在,为了防止奇怪的行为(您必须将最后一个 if 语句更改为上面的语句才能工作),在 if 语句之前添加此行:

lastKey = 'z'

这将告诉程序没有按键被按下,从而阻止该行为。另外,不需要您的 else 语句,因此我将其删除。对于您的最终代码,它应该是:

import pygame
import sys
import speed

pygame.init()
pygame.display.set_mode((1, 1))

lastKey = 'z'

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                speed.Forward()
                lastKey = 'f'
            elif event.key == pygame.K_DOWN:
                speed.Backward()
                lastKey = 'b'

        if event.type == pygame.KEYUP:
            lastKey == 'z'
            if lastKey == 'z':
                speed.Stop()    

这应该可以解决您的问题,只允许 KEYUP 事件仅在您抬起钥匙时激活。希望对您有所帮助!
如果你想知道它的行为:
你的结果是自然的。变量总是 fb 因此 KEYUP 事件被激活,因为字符串不是 x.