如何在Pygame中让文本绘制在背景上层不被遮挡
问题原因
Pygame的blit操作遵循「后绘制的内容覆盖先绘制的内容」的规则,当前写法存在两个核心问题:
- 绘制顺序错误:在事件处理阶段绘制文本,之后才绘制背景,相当于背景直接覆盖了刚画好的文本
- 文本绘制时机错误:只在
write_text_0_event触发的那一瞬间绘制文本,其余帧绘制完背景后没有重绘文本,文本只会存在一帧就被后续帧的背景覆盖
解决方法
调整主循环的绘制逻辑,严格按照「底层元素→顶层元素」的顺序绘制,且文本需要每一帧都重绘,不能仅在事件触发时绘制:
# 提前初始化全局变量存储当前已打印的文本 current_text_0 = "" index_0 = 0 while running: # 第一步:处理所有事件,仅更新文本内容,不做绘制操作 for event in pygame.event.get(): # 其他事件处理逻辑... elif event.type == write_text_0_event: if index_0 <= len(msg0) - 1: current_text_0 += msg0[index_0] index_0 += 1 # 第二步:先绘制背景(底层元素) screen.blit(city_bg, (0, 0)) # 第三步:绘制文本(顶层元素,放在背景绘制之后) text = font.render(current_text_0, True, (255, 255, 255)) screen.blit(text, (100, 100)) # 第四步:刷新屏幕,不要遗漏该步骤 pygame.display.flip()
调整后事件处理阶段仅负责更新文本内容,每一帧都会先画背景,再把最新的文本画在背景上层,既保证了层级正确,也不会因为没有触发打印事件就消失。
内容的提问来源于stack exchange,提问作者Alan Bagel
相关产品推荐
相关产品推荐

