pygame.key.get_pressed() 不工作

pygame.key.get_pressed() is not working

我正在尝试从用户那里获取持续的输入并以此为基础做一些事情。我正在尝试使用 pygame 模块中的 key.get_pressed() 函数。但是,我无法让它工作。我查看了所有其他类似问题,但 none 这些解决方案似乎有效。

import pygame, RCcarFunctions, time
pygame.init()
keypressed = pygame.key.get_pressed()
try:
  while True:
    if keypressed == "pygame.K_w":
      RCcarFunctions.forward()
    elif keypressed  == "pygame.K_a":
      RCcarFunctions.spinleft()
    elif keypressed == "pygame.K_s":
      RCcarFunctions.reverse()
    elif keypressed == "pygame.K_d":
      RCcarFunctions.spinright()
    elif keypressed == "pygame.K_ESCAPE":
      RCcarFunctions.stop()
    pygame.event.pump()
except KeyboardInterrupt:
  RCcarFunctions.cleanup()

将您的 pygame.key.get_pressed() 调用移动到 while True 循环中,如下所示:

import pygame, RCcarFunctions, time
pygame.init()
try:
  while True:
    keypressed = pygame.key.get_pressed()
    if keypressed == "pygame.K_w":
      RCcarFunctions.forward()
    elif keypressed  == "pygame.K_a":
      RCcarFunctions.spinleft()
    elif keypressed == "pygame.K_s":
      RCcarFunctions.reverse()
    elif keypressed == "pygame.K_d":
      RCcarFunctions.spinright()
    elif keypressed == "pygame.K_ESCAPE":
      RCcarFunctions.stop()
    pygame.event.pump()
except KeyboardInterrupt:
  RCcarFunctions.cleanup()

您需要将代码移动到循环内的 get_pressed()

你还需要验证一下returns: 由常量索引的布尔列表。 https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed

import pygame, RCcarFunctions, time
pygame.init()

try:
  while True:
    #get_pressed() returns a list of bools ? 
    keypressed = pygame.key.get_pressed()
    if keypressed[pygame.K_w]:
      RCcarFunctions.forward()
    elif keypressed[pygame.K_a]:
      RCcarFunctions.spinleft()
    elif keypressed[pygame.K_s]:
      RCcarFunctions.reverse()
    elif keypressed[pygame.K_d]:
      RCcarFunctions.spinright()
    elif keypressed[pygame.K_ESCAPE]:
      RCcarFunctions.stop()
    pygame.event.pump()
except KeyboardInterrupt:
  RCcarFunctions.cleanup()

我找到了解决办法!使用事件查询并轮询所需键的状态。如果它们是 'down' 将 bool 切换为 True,如果它们是 'up' 将 bool 切换为 false(每个键都有单独的 bool)。然后在事件查询之外检查每个 bool 的状态,在此基础上做任何事情。

我遇到的主要问题是我没有初始化显示器,我完全不知道您必须初始化显示器才能使 pygame 工作。初始化显示后,我让它工作了。

pygame.init()
size = (640,480)
pygame.display.setmode((640,480))
while True:
  for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_w:
        forward = True
      elif event.key == pygame.K_a:
        left = True
      elif event.key == pygame.K_s:
        reverse = True
      elif event.key == pygame.K_d:
        right = True
    elif event.type == pygame.KEYUP:
      if event.key == pygame.K_w:
        forward = False
      elif event.key == pygame.K_a:
        left = False
      elif event.key == pygame.K_s:
        reverse = False
      elif event.key == pygame.K_d:
        right = False
  if forward & right:
    RCcarFunctions.right()
  elif forward & left:
    RCcarFunctions.left()
  elif forward:
    RCcarFunctions.forward()
  elif left:
    RCcarFunctions.spinleft()
  elif reverse:
    RCcarFunctions.reverse()
  elif right:
    RCcarFunctions.spinright()
  else:
    RCcarFunctions.stop()
except KeyboardInterrupt:
  print ("\ncleaning up")
  RCcarFunctions.cleanup()