【问题标题】:Detect Both Left and Right Mouse Clicks检测鼠标左键和右键
【发布时间】:2021-12-02 23:40:26
【问题描述】:

我正在用 pygame 编写一个 replit 游戏,我希望 pygame 同时检测左击和右击。我看过诸如this 和this 之类的问题,但它们并没有解决我的问题。使用buttons = pygame.mouse.get_pressed(),我一次只能检测到一次点击。当我左键单击或右键单击时,它可以正常工作,但我无法同时左键和右键单击。 如果我按住左键,我必须双击右键才能检测到它。我希望它在第一时间被检测到。

最小工作示例:

import pygame, sys

screen = pygame.display.set_mode((320, 200))
left = False
right = False

while True:
  event = pygame.event.poll()
  buttons = pygame.mouse.get_pressed()
  if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()
  elif event.type == pygame.MOUSEBUTTONDOWN and buttons[0] and not left:
    print('left press')
    left = True
  elif event.type == pygame.MOUSEBUTTONUP and not buttons[0] and left:
    print('left release')
    left = False
  elif event.type == pygame.MOUSEBUTTONDOWN and buttons[2] and not right:
    print('right press')
    right = True
  elif event.type == pygame.MOUSEBUTTONUP and not buttons[2] and right:
    print('right release')
    right = False

  screen.fill((0, 0, 0))
  pygame.display.flip()

典型打印输出:

*left click and then release*
left press
left release

*right click and then release*
right press -- buttons = (True, False, False), left = False, right = False
right release -- buttons = (False, False, False), left = True, right = False

*left click, right click, release both*
left press -- buttons = (True, False, False), left = False, right = False
left release -- buttons = (False, False, False), left = True, right = False

*right click, left click, release both*
right press -- buttons = (False, False, True), left = False, right = False
right release -- buttons = (False, False, False), left = False, right = True

*left click, right double click, release right, release left*
left press -- buttons = (True, False, False), left = False, right = False
right press -- buttons = (True, False, True), left = True, right = False
right release -- buttons = (True, False, False), left = True, right = True
left release -- buttons = (False, False, False), left = True, right = False

*left click, right double click, release left, release right*
left press -- buttons = (True, False, False), left = False, right = False
right press -- buttons = (True, False, True), left = True, right = False
left release -- buttons = (False, False, True), left = True, right = True
right release -- buttons = (False, False, False), left = False, right = True

Same situation for the mirrored case of right click and left double click.

【问题讨论】:

  • 你能展示一下典型的打印输出是什么样的吗?包括button、left和right在每次打印时都有哪些值?
  • @RandomDavis 包含在问题中。这就是你想要的吗?
  • 它必须取决于系统,因为在我的 Linux 上工作 if buttons[0] and buttons[2]: 或者它可能需要首先获取所有事件 for event in pygame.event.get() 并在循环检查之后 mouse.get_pressed()
  • @furas 我也让它在我的 Mac 上使用 IDLE 工作。然而,这是一个合作项目,所以我必须在replit 上做。该平台上是否有任何解决方法?谢谢。

标签: python python-3.x pygame mouse


【解决方案1】:

您必须结合pygame.mouse.get_pressed() 和MOUSEBUTTONDOWN 事件。永远不会同时单击这些按钮。事件一次发生一个,但pygame.mouse.get_pressed() 表示何时按住某个键。使用MOUSEBUTTONDOWN 检测按钮何时被点击,并使用pygame.mouse.get_pressed() 检查另一个按钮是否被按住:

run = True
while run:
      event = pygame.event.poll()
      buttons = pygame.mouse.get_pressed()
      if evet.type == pygame.QUIT:
          run = False 
      
      elif event.type == pygame.MOUSEBUTTONDOWN:
          
          # left clicked and right hold down
          if event.button == 1 and mouse_buttons[2]: 
          
              # [...]

          # right clicked and left hold down
          elif event.button == 3 and mouse_buttons[1]: 

              # [...]
      

【讨论】:

    【解决方案2】:

    我重新考虑了您的事件处理:

    import pygame, sys
    
    screen = pygame.display.set_mode((320, 200))
    left = False
    right = False
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False 
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:  # LMB
                    print('left press')
                    left = True
                elif event.button == 3:  # RMB
                    print('right press')
                    right = True
            elif event.type == pygame.MOUSEBUTTONUP:
                if event.button == 1:
                    print('left release')
                    left = False
                elif event.button == 3:
                    print('right release')
                    right = False
                    
        screen.fill((0, 0, 0))
        pygame.display.flip()
    pygame.quit()
    sys.exit()    
    

    您描述的测试用例按预期工作,例如左键单击、右键单击、右键释放、左释放显示:

    left press
    right press
    right release
    left release
    

    【讨论】:

    • 它仍然对我不起作用。你能在replit 上试试吗,因为我正在和其他几个人一起工作,所以我不能使用本地 IDE。但是,我确实使用 IDLE 让它在我的 mac 上工作,那么是否有任何 replit 的解决方法?
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2011-04-26
    • 2017-09-30
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多