我正在努力理解一个奇怪的"使用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;向上箭头"
我在这里做错了什么?
谢谢!
答案 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_UP
和K_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
事件仅在您解除密钥时激活。我希望这会对你有所帮助!
如果你想知道它的行为:
你的结果很自然。该变量始终为f
或b
,因此KEYUP事件已激活,因为字符串不是x
。