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_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
.
我试图通过使用 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_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
.