pygame未检测到按键



我一直在尝试让pygame检测按键,这样以后我就可以在屏幕上移动角色了。我是编码新手,所以我可能只是错过了一些简单的东西,但我不知道代码出了什么问题,我应该切换到pygame.key.get_pressed()还是其他什么?提前谢谢。

running = True
while running: 
screen.fill((0,0,0))
# set background
screen.blit(background, (0,0))
player(playerX, playerY)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# detecting key presses
if event.type == pygame.KEYDOWN:
if event.type == pygame.K_LEFT:
print("left")
if event.type == pygame.K_RIGHT:
print("right")
if event.type == pygame.K_UP:
print("up")
if event.type == pygame.KEYUP:
if event.type == pygame.K_LEFT or event.type == pygame.K_RIGHT:
print("stop")
pygame.display.update()

这是缩进的问题。您必须在事件循环中而不是应用程序循环中评估事件
如果要确定是否按下了某个键,则必须验证事件类型是否为pygame.KEYDOWN(或pygame.KEYUP用于按钮释放),以及事件的.key属性是否等于键枚举器。

running = True
while running: 
screen.fill((0,0,0))
# set background
screen.blit(background, (0,0))
player(playerX, playerY)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# INDENTATION
#-->|
# detecting key presses
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:  #<-- "key" instead of "type"
print("left")
if event.key == pygame.K_RIGHT: #<-- "key" instead of "type"
print("right")
if event.key == pygame.K_UP:    #<-- "key" instead of "type"
print("up")
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: #<-- "key" instead of "type"
print("stop")
#-->|
# INDENTATION

但是,我建议使用pygame.key.get_pressed()而不是KEYDOWN事件。

键盘事件(请参阅pygame.event模块)仅在键的状态更改时发生一次。KEYDOWN事件在每次按键时发生一次。KEYUP在每次释放密钥时发生一次。将键盘事件用于单个动作或逐步移动

pygame.key.get_pressed()返回一个序列,其中包含每个密钥的状态。如果按下某个键,则该键的状态为True,否则为False。使用pygame.key.get_pressed()评估按钮的当前状态并获得连续移动。

clock = pygame.time.Clock()
velocity = 5
running = True
while running: 
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

keys = pygame.key.get_pressed()
playerX += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * velocity
playerY += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * velocity
screen.blit(background, (0,0))
player(playerX, playerY)
pygame.display.update()

您需要将代码的这一部分缩进为for循环中的

if event.type == pygame.KEYDOWN:
if event.type == pygame.K_LEFT:
print("left")
if event.type == pygame.K_RIGHT:
print("right")
if event.type == pygame.K_UP:
print("up")
if event.type == pygame.KEYUP:
if event.type == pygame.K_LEFT or event.type == pygame.K_RIGHT:
print("stop")
pygame.display.update()

否则,event将始终只是pygame.event.get()列表中的最后一个event

所以基本上,从

running = True
while running: 
screen.fill((0,0,0))
# set background
screen.blit(background, (0,0))
player(playerX, playerY)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# detecting key presses
if event.type == pygame.KEYDOWN:
if event.type == pygame.K_LEFT:
print("left")
if event.type == pygame.K_RIGHT:
print("right")
if event.type == pygame.K_UP:
print("up")
if event.type == pygame.KEYUP:
if event.type == pygame.K_LEFT or event.type == pygame.K_RIGHT:
print("stop")
pygame.display.update()

至:

running = True
while running: 
screen.fill((0,0,0))
# set background
screen.blit(background, (0,0))
player(playerX, playerY)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print("left")
if event.key == pygame.K_RIGHT:
print("right")
if event.key == pygame.K_UP:
print("up")
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
print("stop")
pygame.display.update()

(注意event.keys,我用.替换了部分event.types)

最新更新