Pygame开发类Pong游戏时矩形对象闪烁问题如何解决
问题原因
挡板闪烁的核心问题是主循环渲染逻辑完全写错了:
- 单轮循环里你执行了两次清屏、两次屏幕刷新:第一次清屏后只绘制蓝色挡板就触发刷新,第二次清屏直接把刚画好的蓝色挡板用黑色盖住,只画白色挡板就再次刷新,等于每一帧两个挡板从来没有同时显示在屏幕上,交替出现自然就会闪烁。
- 你注释掉其中一行
win.fill((0, 0, 0))后,其中一个挡板不会被第二次清屏覆盖,所以停止闪烁,但剩下的挡板仍然在交替显示的逻辑里,所以闪烁问题没有完全解决。 - 附带的冗余逻辑问题:重复调用了两次
pygame.key.get_pressed(),完全没有必要,一次调用就能获取全量按键状态;pygame.time.delay(0)等于没有做帧率控制,程序会跑满CPU,不同设备上挡板移动速度会不一致。
Pygame单帧渲染必须遵循固定顺序:处理事件→更新所有元素状态→一次性清屏→绘制全部元素→单次刷新屏幕,拆分渲染步骤必然出现闪烁、元素缺失问题。
修正后的完整代码
import pygame pygame.init() win = pygame.display.set_mode((1280, 720)) pygame.display.set_caption("Pong") # 左侧蓝色挡板参数 x = 15 y = 280 width = 20 height = 130 # 右侧白色挡板参数 x1 = 1245 y1 = 280 width1 = 20 height1 = 130 vel = 10 # 时钟对象用于锁定帧率 clock = pygame.time.Clock() run = True while run: # 锁定帧率为60FPS,保证不同设备移动速度一致 clock.tick(60) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # 单次获取所有按键状态 keys = pygame.key.get_pressed() # 更新左侧挡板位置 if keys[pygame.K_w] and y > 0: y -= vel if keys[pygame.K_s] and y < 720 - height: y += vel # 更新右侧挡板位置 if keys[pygame.K_UP] and y1 > 0: y1 -= vel if keys[pygame.K_DOWN] and y1 < 720 - height1: y1 += vel # 单次清屏 win.fill((0, 0, 0)) # 绘制全部元素 pygame.draw.rect(win, (0, 0, 255), (x, y, width, height)) pygame.draw.rect(win, (255, 255, 255), (x1, y1, width1, height1)) # 单次刷新屏幕 pygame.display.update() pygame.quit()
关键修改点
- 删除循环内重复的
win.fill()和pygame.display.update()调用,保证所有元素绘制完成后再统一推送到屏幕显示 - 合并重复的按键获取逻辑,去掉冗余的
keys2变量 - 替换无效的
pygame.time.delay(0),用Clock.tick()锁定帧率,避免CPU空转和移动速度不一致问题 - 修正原代码里右侧挡板下移边界判断误用左侧挡板高度的隐性bug
内容的提问来源于stack exchange,提问作者cppnoob
相关产品推荐
相关产品推荐

