Pygame中pygame.display.update引发画面闪烁或内容不显示问题求助
问题根源
你的代码执行顺序逻辑错误,导致绘制的矩形被后续操作覆盖:
- 主游戏循环的执行顺序是
事件处理→逻辑更新(update)→画面绘制(draw) - 你把矩形绘制逻辑写在了
update阶段,绘制完成后进入draw方法的第一步就是self.screen.fill(black),会将整个屏幕填充为黑色,直接覆盖你刚画好的矩形,所以不加额外的update调用完全看不到矩形。 - 你加的额外
pygame.display.update(rect)会在屏幕被涂黑前先刷新一次矩形区域,紧接着屏幕被涂黑后又会执行全局的pygame.display.update(),同一帧内矩形区域先显示画好的红色、再被覆盖为黑色,就会出现闪烁问题。
解决方法
遵循Pygame开发的标准规范:逻辑更新与画面绘制完全分离,所有绘制操作统一放在draw阶段执行,全局仅保留一次pygame.display.update()调用即可。
步骤1:修改精灵的update方法
移除update方法里所有绘制相关的代码,只保留逻辑状态更新(碰撞检测、showPopup状态赋值等):
def update(self): self.hitbox.center = numpy.add(self.rect.center,(8,22)) self.interactionhitbox.center = numpy.add(self.rect.center, (8,16)) # 原有碰撞检测、设置self.showPopup为True/False的逻辑保留在这里即可
步骤2:修改Game类的draw方法
在填充屏幕、绘制完全部精灵后,再根据showPopup状态绘制矩形:
def draw(self): self.screen.fill(black) self.all_sprites.draw(self.screen) # 新增弹出矩形绘制逻辑,self.player替换为你实际的玩家精灵实例变量名 if self.player.showPopup: color = (255,0,0) rect = pygame.Rect((0,0,60,60)) pygame.draw.rect(self.screen, color, rect) self.clock.tick(FPS) pygame.display.update()
修改完成后删除原来多余的pygame.display.update(rect)调用即可,既可以正常显示矩形,也不会出现闪烁问题。
内容的提问来源于stack exchange,提问作者William Redding
相关产品推荐
相关产品推荐

