Python Pygame:如何使按键只输入一次?
嗨,我正在创造一个游戏,我有多个阶段。我希望这样,每当用户按下键Python Pygame:如何使按键只输入一次?,python,pygame,Python,Pygame,嗨,我正在创造一个游戏,我有多个阶段。我希望这样,每当用户按下键a,下一阶段就会触发。这是我的代码示例 gameStage = 0 ## outside while loop ##INSIDE whileloop if gameStage == 0: ##insert drawings,music, etc if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: gameSt
a
,下一阶段就会触发。这是我的代码示例
gameStage = 0 ## outside while loop
##INSIDE whileloop
if gameStage == 0:
##insert drawings,music, etc
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
gameStage += 1
if gameStage == 1:
##insert drawings,music, etc
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
gameStage += 1
我的问题是,当用户按下
a
键时,a
将被多次输入,具体取决于按键的按住时间。因此,它将一直跳到我的最后一个阶段。如何使gameStage
仅在按下并抬起键时才为+=1?如果我不清楚,请告诉我。谢谢你的帮助。谢谢。您可以使用pygame.KEYUP
事件
e、 g
if event.type==pygame.KEYUP:
但是,除非调用了pygame.key.set_repeat
并设置了非零的repeat值,否则不应重复获取KEYDOWN
消息
即使仅捕获
KEYUP
消息,您也会获得GameStage
的重复增量,这表明代码中存在其他问题。您可以使用KEYUP事件,如上所述,或者在按键事件发出后几秒钟内停止对其作出反应。当按下或释放键盘按钮时apygame.KEDOWN
或pygame.KEYUP
事件仅出现在事件队列上
正如您所做的,您需要设置一个全局变量GameStage
,该变量指示当前游戏状态:
GameStage = 0 ## outside while loop
在此之后,我们运行主游戏循环,并使用函数从偶数队列中获取所有事件,该函数读取并从队列中移除事件:
while True:
#get all events from the event queue
for ev in pygame.event.get():
如果读取事件表示某个游戏的按键按下事件,程序逻辑将更新GameStage
变量,类似于所谓的:
完整的程序块如下所示:
#global variable GameStage for state-machine
GameStage = 0
#main game loop
while True:
#get all events from the event queue
for ev in pygame.event.get():
if ev.type == pygame.KEYDOWN:
if ev.key == pygame.K_a:
if GameStage == 0:
GameStage += 1
#do something
elif GameStage == 1:
GameStage += 1
#do something great
elif GameStage == 2:
GameStage += 1
#do something great again
elif GameStage == 3:
#this is the last stage, so you cloud go back to stage #0
GameStage = 0
#for debugging print current GameStage
print(GameStage)
只有当你按下时,GameStage
才会被更新一次,无论你按住多长时间
希望这有帮助:)
1正如@sloth所指出的,这可以通过调用来更改,当按下键时,将生成多个
pygame.KEYDOWN
事件。改用key up如何?pygame.event.get()中的for事件在哪里:
循环?在当前的代码布局中,似乎每个阶段都需要一个单独的事件循环。如果我错了,请纠正我,但KEYUP不只是意味着KEYUP已启动吗?不是说它已经发布了吗?如果我是对的,这解决不了任何问题。当钥匙保持打开时,它将跳过所有阶段。也许我做错了什么?不,当钥匙被释放时,你应该只得到一个KEYUP事件。作为密钥重复机制,您只能获得多个KEYDOWN事件。如果是按照你的建议,你会永久地收到所有你没有按过的按键的按键信息。不知道我做错了什么。我正在使用key.up事件,但我仍然遇到同样的问题。我使用了上面提供的模板,并将KEYDOWN替换为KEYUP。仍在跳过各个阶段。谢谢你的帮助。检查你的缩进。然后打印几张图片,看看代码是怎么走的。是否调用pygame.key。设置\u repeat
代码中的任意位置?如果不是,那么无论如何你都不应该得到密钥重复。这表明代码中存在错误。我如何停止对keydown事件做出几次滴答声的反应?例如:ticks\u to\u ignore=0如果event.type==pygame.keydown和ticks\u to\u ignore==0:ticks\u to\u ignore=10#处理事件#如果ticks\u to\u ignore>0:ticks\u to\u ignore-=1,则在主循环的其他地方处理事件
一个丑陋的黑客,keyup对玩家来说可能更容易和更明显。…事件只出现在事件队列上的一个事件
:这通常是正确的,但前提是你不使用pygame.key.set\u repeat
(这在大多数情况下都很糟糕)。@sloth:Fair:)我要补充一点,因为这可能是问题所在。
#global variable GameStage for state-machine
GameStage = 0
#main game loop
while True:
#get all events from the event queue
for ev in pygame.event.get():
if ev.type == pygame.KEYDOWN:
if ev.key == pygame.K_a:
if GameStage == 0:
GameStage += 1
#do something
elif GameStage == 1:
GameStage += 1
#do something great
elif GameStage == 2:
GameStage += 1
#do something great again
elif GameStage == 3:
#this is the last stage, so you cloud go back to stage #0
GameStage = 0
#for debugging print current GameStage
print(GameStage)