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()
我正在尝试从用户那里获取持续的输入并以此为基础做一些事情。我正在尝试使用 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()