Pygame - 键上/下行为

时间:2015-01-01 18:38:29

标签: python keyboard pygame

我正在努力理解一个奇怪的"使用KEY DOWN和UP进行pygame行为。 我保持"向上箭头"一直按下但我从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()

结果如下:

按下"向上箭头"下来...

Forward
Stop
Forward
Stop
Forward
Stop
Forward
Stop

发布了#34;向上箭头"

我在这里做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您遇到问题:
您的问题位于变量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