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事件,如上所述,或者在按键事件发出后几秒钟内停止对其作出反应。

当按下或释放键盘按钮时a
pygame.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)