Pygame:如何让KEYDOWN只输入一次?

时间:2016-01-13 03:39:30

标签: 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:
            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?如果我不清楚,请告诉我。感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:1)

按下或释放键盘按钮时 pygame.KEDOWNpygame.KEYUP事件仅显示在事件队列中 1

正如您所做的那样,您需要设置一个全局变量GameStage,它表示当前的游戏状态:

GameStage = 0 ## outside while loop

在此之后,我们运行主游戏循环并使用pygame.event.get()函数从偶数队列中获取所有事件,该函数从队列中读取和删除事件:

while True:
    #get all events from the  event queue
    for ev in pygame.event.get():

如果读取事件表示 a 的按键事件,则程序逻辑更新GameStage变量,类似于所谓的state-machine

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

        # and so on ;)

完整的程序块如下所示:

#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)

只有在您按下时 - 无论您按住多长时间 - a GameStage只会更新一次。

希望这会有所帮助:)

1 正如@sloth所说,这可以通过调用pygame.key.set_repeat()进行更改,这会在按下按键时生成多个 pygame.KEYDOWN事件

答案 1 :(得分:0)

您可以使用pygame.KEYUP事件。

e.g。

if event.type == pygame.KEYUP:

但是,除非您调用了KEYDOWN并设置了非零重复值,否则不应该重复pygame.key.set_repeat条消息。

即使只捕获GameStage条消息,您获得KEYUP的重复增量这一事实也表明您的代码中存在其他问题。

答案 2 :(得分:0)

您可以按照上面的建议使用加密事件,也可以在发布后停止对keydown事件做出反应。