【问题标题】:Python PyGame press two buttons at the same timePython PyGame 同时按下两个按钮
【发布时间】:2020-03-29 14:33:34
【问题描述】:
import pygame

finish = False
while not finish:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
            print "A"
        if event.key == pygame.K_RIGHT:
            print "B"
        if event.key == pygame.K_LEFT:
            print "C"
    

为什么这不能让我同时按下 2 个按钮,我该如何编写这样的代码?

【问题讨论】:

标签: python python-2.7 events pygame


【解决方案1】:

试试这个:

import pygame

finish = False
while not finish:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                print "A"
            if event.key == pygame.K_RIGHT:
                print "B"
            if event.key == pygame.K_LEFT:
                print "C"

在您的版本中,您正在迭代 pygame.event.get() 并且您只评估 for 循环中的最后一个事件(除了退出逻辑),这意味着您只评估最后一次按键。将代码移动到循环中,您可以评估所有事件。

如果您想检测多个按键,请使用pygame.key.get_pressed()

finish = False
while not finish:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        print("C")    
    if keys[pygame.K_RIGHT]:
        print("B")
    if keys[pygame.K_UP]:
        print("A")

【讨论】:

  • 但是如果我这样做我不能按住按钮
  • 然后删除 if event.key == pygame.KEYDOWN,因为它只有在按键被按下时才会为真,而不是在当前按下时。
  • 如果你使用pygame.key.get_pressed(),那么你可以这样做:keys = pygame.key.get_pressed() 然后例如if pygame.K_UP not in keys:
  • if keys.get(pygame.K_LEFT): 对我来说是一个错误:AttributeError: 'tuple' object has no attribute 'get'
  • 我的错,我错误地认为get_pressed() 返回一个dict,它实际上返回一个tuple。我更新了答案。所以你会做if not keys[pygame.K_LEFT] 而不是keys.get() - 很抱歉造成混乱。
【解决方案2】:

键盘事件(例如pygame.KEYDOWN)仅在按下按钮时发生一次。
使用pygame.key.get_pressed() 持续评估按钮的状态。例如:

finish = False
while not finish:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        print "A"
    if keys[pygame.K_RIGHT]:
        print "B"
    if keys[pygame.K_LEFT]:
        print "C"

或者如果你想得到一个列表:

finish = False
while not finish:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True

    keys = pygame.key.get_pressed()
    if any(keys):
        kmap = {pygame.K_UP : "A", pygame.K_RIGHT : "B", pygame.K_LEFT : "C"}
        sl = [kmap[key] for key in kmap if keys[key]]
        print sl

【讨论】:

  • 如何检查是否未按下键?
  • @yoav 例如if not keys[pygame.K_UP]:。如果你想知道是否按下了任何键if any(keys):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多