You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:36:03