Изменение шрифта в сообщении 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).