pygame检测不到键盘按键输入,是否需改用pygame.key.get_pressed()?
问题排查与解决方案
你当前代码的错误点
- 键盘检测逻辑写在了事件遍历循环的外部:
for event in pygame.event.get()是逐一遍历当前帧产生的所有事件,只有在这个循环内部才能拿到每一个有效事件对象,写在循环外的event只会保留最后一个遍历到的事件,绝大多数时候都无法匹配到按键事件。 - 混淆了事件对象的属性:判断按键类型要读取
event.key属性,你所有判断按键的地方都错误写了event.type,event.type仅用来判断当前是KEYDOWN/KEYUP/QUIT这类事件类型。 - 冗余调用了两次
pygame.display.update(),单帧只需执行一次屏幕刷新即可。
修正后的事件写法
running = True while running: screen.fill((0,0,0)) # set background screen.blit(background, (0,0)) player(playerX, playerY) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 键盘检测逻辑移到事件循环内部 if 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") if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: print("stop") # 单帧只刷新一次 pygame.display.update()
关于是否改用pygame.key.get_pressed()的说明
两种方案没有优劣,只是适用场景不同,可以按需选择:
- 你当前用的
KEYDOWN/KEYUP事件方案,适合处理单次触发的操作,比如按一次空格跳跃、按一次ESC打开菜单,不需要长按连续响应的场景。 pygame.key.get_pressed()更适合你做角色长按移动的需求,它会返回当前所有按键的状态数组,每帧直接判断按键是否被按住即可,不需要处理事件逻辑,示例写法如下:
running = True while running: screen.fill((0,0,0)) screen.blit(background, (0,0)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 直接获取当前所有按键状态 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: playerX -= 2 # 按住左键每帧左移2像素 if keys[pygame.K_RIGHT]: playerX += 2 if keys[pygame.K_UP]: playerY -= 2 if keys[pygame.K_DOWN]: playerY += 2 player(playerX, playerY) pygame.display.update()
内容的提问来源于stack exchange,提问作者smonk
相关产品推荐
相关产品推荐

