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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:00:55