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

为什么Pygame绘制文本无法完全覆盖旧文本且周围出现奇怪虚影?

问题原因

你现在的代码有三个核心错误导致虚影问题:

  • 第一,绘制逻辑的判断条件永远不会触发:你先执行了print_amount = current_amount,下一行立刻判断if print_amount != current_amount,这个条件不可能成立,所以你写的覆盖逻辑从来都没有实际运行过。
  • 第二,就算覆盖逻辑能运行,实现逻辑也不对:你用来覆盖的黑文本用的是新的数字内容,旧数字和新数字的形状、宽度都不一样,根本不可能完全盖住之前的旧文本。
  • 第三,pygame的字体渲染默认带抗锯齿,边缘会有半透明的过渡像素,就算你用更大的同内容文本覆盖,半透明像素叠加后也会留下虚影。

修复方案

方案1(最推荐,符合pygame常规渲染逻辑)

每帧绘制所有内容前,先统一清空整个画布(用背景色填充),再重新绘制当前帧的所有元素(包括小球、数字文本等),这是pygame开发的标准流程,从根源上避免残留问题:

# 括号内替换为你实际的背景色RGB值,示例为黑色背景
screen.fill((0,0,0))
# 之后再绘制当前帧的所有内容:小球、文本等
totalText = set_text(str(current_amount), 350, 20, 35)
screen.blit(totalText[0], totalText[1])

这个方案不需要保留set_text2函数,也不需要额外的判断逻辑,实现最简单也最不容易出问题。

方案2(不想清全屏的替代方案)

如果你的场景不需要或者不能每帧清全屏,可以记录上一次文本的rect区域,每次更新数字前用背景色填充这个区域,再绘制新的文本:

# 初始化的时候定义变量存储上一次的文本rect
last_text_rect = None

# 每次更新文本的逻辑
# 先擦除之前的文本
if last_text_rect is not None:
    # 第二个参数指定只填充文本所在的rect区域,不会影响其他内容
    screen.fill((0,0,0), last_text_rect)
# 绘制新的文本
totalText = set_text(str(current_amount), 350, 20, 35)
screen.blit(totalText[0], totalText[1])
# 更新存储的rect为当前文本的区域
last_text_rect = totalText[1]

这个方案同样不需要保留set_text2相关的代码。

额外提示

你代码里还有两个不影响运行的小问题:

  1. set_text函数的注释写错了,(255,255,255)是白色不是黑色;
  2. set_text2的注释说要把字号+2,实际代码里还是用的传入的font_size,没有生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:04