Pygame加载字母精灵图后无法显示文本,求问题排查
问题描述
我正在跟随Tech with Tim的平台游戏开发教程,基于教程中的load_sprites函数编写了一个从精灵图加载字母的函数:
def load_letters_from_sprite_sheets(w, h): path = join('Assets', 'Menu', 'Text',) images = [f for f in listdir(path) if isfile(join(path, f))] all_images = {} for image in images: text_sheet = pygame.image.load(join(path, image)).convert_alpha() letters = [] for i in range(text_sheet.get_width() // w): for j in range(text_sheet.get_height() // h): surface = pygame.Surface((w, h), pygame.SRCALPHA, 32) rect = pygame.Rect(i * w, j * h, w, h) surface.blit(text_sheet, (0, 0), rect) letters.append(pygame.transform.scale2x(surface)) all_images[image.replace('.png', '')] = letters return all_images
在Game().init中调用该函数加载含字母的精灵图:
self.letter_sheets = load_letters_from_sprite_sheets(8, 10)
字母精灵图为包含大小写字母的8x10规格图集。我还编写了显示文本的函数:
def display_text(window, all_images, x, y, text: str, color = 'white', size = 1.0): if color.lower() == 'white': src_image = all_images['Text (White) (8x10)'] else: src_image = all_images['Text (Black) (8x10)'] for i in range(len(src_image)): #print(f'i: {i}, img: {src_image[i]}') window.blit(src_image[i], (x + i * src_image[i].get_width() , y))
但在游戏主循环中调用display_text(self.window, self.letter_sheets, 100, 100, 'abcdefghijklmnopqrstuvwxyz', 'white')时,文本完全无法显示。尝试直接绘制所有加载的字母也没用,请问哪里出问题了?
问题排查与解决
1. 核心逻辑错误:未匹配文本字符与对应精灵
你的display_text函数现在是遍历所有加载的字母精灵并全部绘制,而不是根据传入的text参数只绘制对应字符。比如传'abc'却把26个字母都画出来,要么字符堆在一起,要么超出屏幕范围,自然看不到预期内容。
需要先建立字符到精灵索引的映射(按你的精灵图字符顺序调整),再修改绘制逻辑:
def display_text(window, all_images, x, y, text: str, color = 'white', size = 1.0): # 精灵图里的字符顺序,必须和你的图集完全对应 CHAR_ORDER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' if color.lower() == 'white': src_images = all_images['Text (White) (8x10)'] else: src_images = all_images['Text (Black) (8x10)'] current_x = x for char in text: if char not in CHAR_ORDER: continue # 跳过未定义的字符 idx = CHAR_ORDER.index(char) letter_surface = src_images[idx] # 处理大小缩放 if size != 1.0: letter_surface = pygame.transform.scale(letter_surface, (int(letter_surface.get_width() * size), int(letter_surface.get_height() * size))) window.blit(letter_surface, (current_x, y)) current_x += letter_surface.get_width()
2. 验证精灵加载正确性
- 检查
Assets/Menu/Text路径下的文件名是否完全匹配Text (White) (8x10).png和Text (Black) (8x10).png,注意大小写、空格不能错。 - 在
load_letters_from_sprite_sheets函数末尾加print(all_images.keys()),确认输出里有对应的键名。 - 打印
len(src_images),看加载的精灵数量是否和你图集里的字符数一致,验证切割逻辑是否正确。
3. 确认绘制顺序与屏幕刷新
- 确保
display_text是在背景绘制之后、屏幕刷新之前调用的。如果先执行pygame.display.update()再绘制文本,内容不会被渲染到屏幕上。 - 检查
self.window是否是正确初始化的显示Surface,没有被其他Surface覆盖。
内容的提问来源于stack exchange,提问作者Avi Michaely
相关产品推荐
相关产品推荐

