为什么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相关的代码。
额外提示
你代码里还有两个不影响运行的小问题:
set_text函数的注释写错了,(255,255,255)是白色不是黑色;set_text2的注释说要把字号+2,实际代码里还是用的传入的font_size,没有生效。
内容的提问来源于stack exchange,提问作者Noamiko
相关产品推荐
相关产品推荐

