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

Pygame按键盘按键移除精灵切换左侧贴图报错如何解决?

报错原因

你调用了不存在的方法:pygame.Surface 类(也就是你创建的窗口对象WIN)本身没有remove方法,这是报错的直接原因。

实现逻辑纠正

pygame的2D渲染逻辑是逐帧全量重绘,不需要手动删除上一帧的元素:

  • 你每一帧都会先调用WIN.blit(BACKGROUND, (0, 0))绘制全屏背景,这一步会直接覆盖上一帧的所有内容,之前绘制的主精灵自然会被清除
  • 你只需要在绘制角色的步骤,根据当前是否按下a键,选择要绘制的精灵贴图即可

修改步骤

  1. 调整draw_window函数,增加按键状态的入参,根据按键状态选择绘制的角色贴图
def draw_window(keys_pressed, man):
    WIN.blit(BACKGROUND, (0, 0))
    # 判断是否按了a键,选择对应贴图
    if keys_pressed[pygame.K_a] and man.x + 10 > 0:
        WIN.blit(MAIN_CHARACTER_LEFT, (man.x, man.y))
    else:
        WIN.blit(MAIN_CHARACHTER, (man.x, man.y))
  1. 修改handle_movement函数,只处理移动逻辑,不需要操作删除精灵
def handle_movement(keys_pressed, man):
    if keys_pressed[pygame.K_a] and man.x + 10 > 0: #LEFT
        man.x -= VEL # 补上向左移动的逻辑
    # 可按需补充其他方向移动逻辑,示例向右移动:
    if keys_pressed[pygame.K_d] and man.x + 70 < WIDTH: #RIGHT
        man.x += VEL
  1. 修改main函数中相关调用逻辑
def main():
    man = pygame.Rect(350, 375, 70, 90)
    gameLoop = True
    clock = pygame.time.Clock()
    while gameLoop:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameLoop = False
                pygame.quit() # 修正之前的错误写法,pygame.QUIT是事件常量,退出方法是pygame.quit()
        keys_pressed = pygame.key.get_pressed()
        handle_movement(keys_pressed, man) # 先处理移动,再绘制
        draw_window(keys_pressed, man)
        pygame.display.update()

内容的提问来源于stack exchange,提问作者Aaseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:36:02