Pygame使用pygame.key.get_pressed()按住按键移动角色出现延迟问题
问题原因
你遇到的按键按住延迟问题,核心是将pygame.key.get_pressed()的移动逻辑写在了for event in pygame.event.get()事件循环内部:
pygame.event.get()仅在有新事件(比如按键按下/松开、窗口操作等)时才会遍历执行内部代码,系统默认的按键重复事件存在初始延迟,按住按键后需要等延迟结束才会连续生成按键事件,也就导致移动逻辑只有在事件生成时才会运行,出现延迟。pygame.key.get_pressed()本身是用于检测全局按键实时状态的API,返回值每帧都会更新,不需要和事件循环绑定。
修复方案
- 将四个方向按键的判断逻辑从事件循环中移出,放在事件循环外的主循环层级,保证每帧都会执行一次按键检测,只要按键处于按住状态就会触发移动,完全消除延迟。
- 删除冗余的两次
pygame.display.update()调用,仅保留一次即可,避免不必要的性能消耗。
修改后完整代码
import pygame, sys from pygame.locals import * pygame.init() DISPLAYSURF = pygame.display.set_mode((400, 400)) pygame.display.set_caption('Hello World!') green = (0,255,0) FPS = 60 FpsClock = pygame.time.Clock() playerY = 200 playerX = 200 while True: # 绘制背景和玩家 pygame.draw.rect(DISPLAYSURF,(255, 255,255),(0,0,400,400)) pygame.draw.rect(DISPLAYSURF, green,(playerX, playerY,20, 20)) # 每帧获取全局按键状态 keys = pygame.key.get_pressed() # 事件循环仅处理窗口事件类逻辑 for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() # 移动逻辑放到主循环,每帧检测执行 if keys[pygame.K_z]: playerY -= 5 if keys[pygame.K_s]: playerY += 5 if keys[pygame.K_d]: playerX += 5 if keys[pygame.K_q]: playerX -= 5 # 更新画面 pygame.display.update() FpsClock.tick(FPS)
内容的提问来源于stack exchange,提问作者erramidev
相关产品推荐
相关产品推荐

