如何在Pygame中分屏处理字体更新:左侧替换右侧叠加
实现左侧替换、右侧叠加的文本显示效果
我来帮你搞定这个需求!咱们先理清楚核心改动方向,再看具体代码:
核心思路
- 右侧叠加显示:不能再用单个变量存储
text4,得用一个列表来保存所有生成的文本表面,这样每次新增的内容都能保留下来,渲染时逐个绘制 - 左侧替换更新:只需要维护一个存储当前最新文本的变量,每次更新直接覆盖旧的内容即可
- 屏幕分区:以屏幕宽度中线(320像素)为界,左侧文本居中在左半屏,右侧文本居中在右半屏
- 定时更新:每2秒自动触发内容更新,左侧替换为新文本,右侧将新文本加入叠加队列
修改后的完整代码
import pygame import time pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() done = False font = pygame.font.SysFont("comicsansms", 72) start = time.time() F = 0 # 右侧用列表存储所有要叠加的文本 right_texts = [] # 左侧只存储当前最新的文本 left_current_text = None while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: done = True # 保留回车触发更新的逻辑(可选,也可以完全依赖定时) elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN: F += 1 new_text4 = font.render(str(F), True, (128, 128, 0)) right_texts.append(new_text4) left_current_text = font.render(str(F), True, (0, 128, 0)) # 每2秒自动更新一次 passed_time = time.time() - start if passed_time > 2: start = time.time() F += 1 # 右侧添加新文本到叠加列表 new_text4 = font.render(str(F), True, (128, 128, 0)) right_texts.append(new_text4) # 左侧替换为最新文本 left_current_text = font.render(str(F), True, (0, 128, 0)) # 填充背景(必须先填充,否则左侧旧文本不会消失) screen.fill((255, 255, 255)) # 绘制左侧文本:只显示当前最新的 if left_current_text is not None: # 左半屏居中计算:x取0-320的中点,减去文本宽度的一半 left_x = 160 - left_current_text.get_width() // 2 left_y = 240 - left_current_text.get_height() // 2 screen.blit(left_current_text, (left_x, left_y)) # 绘制右侧文本:遍历列表,逐个往下排列 if right_texts: # 每个文本之间的间距 line_spacing = 80 # 起始y坐标,从顶部开始往下 start_y = 40 for idx, text_surface in enumerate(right_texts): # 右半屏居中计算:x取320-640的中点,减去文本宽度的一半 right_x = 480 - text_surface.get_width() // 2 right_y = start_y + idx * line_spacing screen.blit(text_surface, (right_x, right_y)) pygame.display.flip() clock.tick(60)
关键改动说明
数据结构调整:
- 把单个
text4变量改成right_texts列表,每次新增文本都append进去,实现叠加存储 - 左侧用
left_current_text变量只存最新文本,每次更新直接覆盖
- 把单个
渲染逻辑调整:
- 左侧每次只绘制当前的
left_current_text,且每次循环先填充白色背景,这样旧文本会被覆盖,实现“替换”效果 - 右侧遍历
right_texts列表,按索引计算每个文本的y坐标,实现从上到下的叠加排列
- 左侧每次只绘制当前的
位置计算优化:
- 左半屏的中心x坐标是
160(640/2 /2),右半屏的中心x坐标是480(640/2 + 640/2/2),确保文本在各自区域居中 - 右侧文本用
line_spacing控制行间距,避免重叠
- 左半屏的中心x坐标是
定时逻辑保留:
- 保留了每2秒自动更新的逻辑,同时也保留了回车触发更新的功能(如果不需要回车触发,可以删掉对应的KEYDOWN分支)
内容的提问来源于stack exchange,提问作者Derick Kolln
相关产品推荐
相关产品推荐

