Изменение шрифта в сообщении LiveWires

Я работаю над игрой, и когда ты ее проигрываешь, она говорит, что игра окончена, но я хотел изменить шрифт, и я не знаю, как, вот часть кода, на которой я сосредоточен:

def end_game(self):
        """ End the game. """
        end_message = games.Message(value = "You didn't eat the pie, game over!",
                                    size = 70,
                                    color = color.red,
                                    x = games.screen.width/2,
                                    y = games.screen.height/2,
                                    lifetime = 7 * games.screen.fps,
                                    after_death = games.screen.quit)
        games.screen.add(end_message)

что я хочу, это в основном изменить шрифт, скажем, Calibri

1 ответ

Решение

Короткий ответ

Ты не можешь

Чуть более длинный ответ

LiveWires предназначен для того, чтобы начать обучение программированию. В своей попытке он попытается упростить для вас вещи. Сначала полезна такая библиотека, как LiveWires: она делает большую часть работы за вас, позволяя вам сосредоточиться на изучении кода (и создании веселой игры!)

Однако в какой-то момент такая сложная система будет делать то, чего вы, возможно, не хотите. В нашем случае LiveWires заставляет весь текст использовать шрифт "по умолчанию", и, похоже, не дает никакого способа его изменить.

Еще более длинный ответ

Я смог определить это, посмотрев исходный код самой платформы LiveWires (она также написана на Python). LiveWires Message класс, который вы используете, наследуется от LiveWires Text учебный класс. Вы можете посмотреть на Text код класса самостоятельно; он должен находиться в каталоге "livewires" в файле с именем "games.py". Я покажу часть кода для класса "Текст" ниже:

class Text(Object, ColourMixin):
    """
    A class for representing text on the screen.

    The reference point of a Text object is the centre of its
    bounding box.
    """

    def __init__(self, screen, x, y, text, size, colour, static=0):

        self.init_text (screen, x, y, text, size, colour, static)

    def init_text (self, screen, x, y, text, size, colour, static=0):
        """
        Arguments:

        screen -- the screen the object is on.
        x -- x-coordinate of centre of bounding box.
        y -- y-coordinate of centre of bounding box.
        text -- the text to display.
        size -- nominal height of the text, in pixels.
        colour -- the colour the text should be.
        """
        if not _have_font:
            raise GameError, "We don't have pygame.font, so can't create text objects"
        self._size = size
        self._colour = colour
        self._text = text
        self._font = pygame.font.Font(None, self._size)
        self._a = 0
        surface = self._create_surface()
        Object.__init__(self, screen, x, y, surface, x_offset=self._x_offset,
                        y_offset=self._y_offset, static=static)
        self.move_to(x,y)

    # There are more methods...

В частности, я смотрю на эту часть __init__ метод...

self._font = pygame.font.Font(None, self._size)
self._a = 0
surface = self._create_surface()

По сути, все, что происходит, заключается в том, что каждый текстовый элемент в LiveWires создается с использованием объекта pygame.font.Font (pygame - это утилита, которую LiveWires использует для того, чтобы фактически выполнять многие вещи, которые она выполняет). LiveWires использует создание объекта Font особым образом (используя None в качестве первого аргумента), чтобы найти шрифт "по умолчанию" для использования. Вы можете определить, что он использует в качестве шрифта по умолчанию, выполнив...

import pygame
print pygame.font.get_default_font()

Заставить шрифты хорошо работать на разных компьютерах может оказаться непросто, поэтому для авторов исходного кода LiveWires достаточно просто использовать весь текст с использованием шрифта "по умолчанию".

Вы должны отметить, что _font Атрибут начинается с подчеркивания, которое в Python является соглашением, которое в основном гласит: "Не играй с этим!" Другими словами, это плохая идея создать объект Message и затем попытаться сделать...

# Don't do this!
end_message._font = pygame.font.Font('/path/to/my/font/file', size)

Хотя это БЫЛО заменит объект шрифта в классе Message другим шрифтом, если вы прочитаете код немного больше, вы поймете, что текст уже отрисован в исходном шрифте (по умолчанию) на поверхности; Вы изменили бы объект шрифта слишком поздно.

Возможно, есть решение...

Вы можете попытаться изменить код LiveWires. Вы можете заменить строку в классе Text, который я показал выше, на...

self._font = pygame.font.Font("/path/to/my/font/file", self._size)

Это должно загрузить другой шрифт из файла шрифта. Имейте в виду, что это изменит шрифт для ВСЕГО текста в вашей игре, поскольку весь текст использует один и тот же класс Text.

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

Опираясь на это решение

Если вы можете извлечь предыдущее, то, возможно, вы могли бы пойти еще дальше и изменить класс Text, чтобы вы могли указать имя файла шрифта. Это будет означать, что вам нужно будет изменить конструктор Text (__init__ метод), а также init_text метод. Кроме того, любые другие классы, которые вызывают эти методы (например, init_text называется из Message.init_message функция в LiveWires).

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