嗨,我正在创造一个我有多个阶段的游戏。我想这样做,以便每次用户按下键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?如果我不清楚,请告诉我。感谢任何帮助。感谢。
答案 0 :(得分:1)
按下或释放键盘按钮时 pygame.KEDOWN
或pygame.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事件做出反应。