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)

Изображение с буквами Поэтому я создал небольшую функцию для загрузки букв в список:

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')

Что мне здесь не хватает? Спасибо за помощь :)

Я попытался отобразить все буквы, загруженные с изображения (пока без учета ввода пользователя), но они не отобразились на экране.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я воспроизвел ваш код здесь:

Он что-то отображает, вы могли бы предоставить необходимый импорт, чтобы сделать это более понятным. Поэтому я предполагаю, что у вас ошибка конфигурации где-то еще.

Всегда полезно создать минимальный пример вашей ошибки. Используйте как можно меньше кода, чтобы воссоздать возникшую проблему.

Другая проблема заключается в том, что ваше отображение отключено. Вы загружаете много пустых прямоугольников, вам нужно изменить отображение. Кроме того, вы вообще не используете ввод текста и просто перебираете все буквы. Возможно, это специально для отладки. Улучшенная функция отображения текста:

def display_text(window, letter_images, x, y, text: str, color='white', size=1.0):
    char_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:?!()+-"
    
    for char in text:
        if char in char_map:
            index = char_map.index(char)
            letter_image = letter_images[index]
            scaled_image = pygame.transform.scale(letter_image, (int(letter_image.get_width() * size), int(letter_image.get_height() * size)))
            window.blit(scaled_image, (x, y))
            x += scaled_image.get_width()

Ах, извините, не хотел публиковать полный код, потому что он слишком длинный. Вот оно: Pastebin.com/zN1XckqM Спасибо за вклад, я действительно не сопоставлял его для целей отладки, я хотел увидеть, что он отображает что-нибудь, прежде чем начинать сопоставление символов.

Avi Michaely 13.07.2024 14:50

Все заработало, пришлось внести небольшие изменения, но теперь все работает отлично, спасибо!: Ссылка на исправленный код: Pastebin.com/UwFhb8EA

Avi Michaely 13.07.2024 15:31

Когда-нибудь я пойму, почему люди минусуют совершенно полезные ответы. Сегодня не тот день.

Bindestrich 14.07.2024 10:55

Другие вопросы по теме