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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:54:25