Pygame修改player.position移动精灵出现复制切半问题求解
问题原因
出现精灵复制、切半的显示异常,是两个核心Pygame绘制逻辑编写错误导致的:
- 缺少每帧清屏操作。Pygame的窗口不会自动擦除上一帧绘制的内容,每次将移动后的精灵绘制到新位置时,旧位置的精灵图案会一直残留在窗口上,多层图案叠加就会出现“精灵被复制”的残影效果。
- 屏幕刷新函数位置错误。
pygame.display.update()被写在了主循环和绘制函数外部,程序启动时仅会执行一次屏幕刷新,后续主循环里的绘制内容不会被完整同步到窗口上,就会出现精灵显示不全、被切半的问题。
异常显示效果参考:
修复方案
玩家类代码不需要做任何修改,只需要调整主文件的绘制逻辑即可:
- 在绘制函数的最开头添加窗口填充代码,每帧绘制前用背景色覆盖整个窗口,清除上一帧的残留内容。
- 将
pygame.display.update()移动到绘制函数的最末尾,保证每帧所有游戏元素绘制完成后,再统一把结果刷新到屏幕上。
修正后的主文件代码如下:
import pygame import player import os WIDTH, HEIGHT = 750, 750 # 可自行修改背景色数值,此处用草绿色作为高尔夫球场示例色 BG_COLOR = (34, 139, 34) WINDOW = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("GOLF") # 初始化玩家对象 player = player.PlayerClass() def draw_window (): # 每帧绘制前先清屏 WINDOW.fill(BG_COLOR) # 绘制玩家精灵 WINDOW.blit(player.texture, player.position) # 所有内容绘制完成后统一刷新屏幕 pygame.display.update() def LeftClick (): player.position.x += 10 def main (): run = True FPS = 60 clock = pygame.time.Clock() while run: clock.tick(FPS) draw_window() for event in pygame.event.get(): if event.type == pygame.QUIT: run = False elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: LeftClick() main()
修改完成后运行,点击左键移动玩家精灵时就不会再出现残影、切半的显示问题。
内容的提问来源于stack exchange,提问作者NaniNoni
相关产品推荐
相关产品推荐


