На этом занятии
мы с вами разберемся как в Pygame происходит
отображение текста разными шрифтами. И начнем со шрифтов. Для работы с ними
имеется встроенный модуль:
pygame.font
в котором
определены следующие полезные классы и функции:
-
SysFont(fontname,
size) – класс для выбора предустановленного шрифта (по имени fontname) с размером
size (в пикселях);
-
Font(path,
size) – класс для загрузки шрифта по указанному пути path с размером size (в пикселях);
-
get_fonts()
– функция, возвращающая имена предустановленных в системе шрифтов;
-
match_font(fontname)
– функция возвращающая путь к предустановленному шрифту по его имени.
Например, вот
так можно получить список всех шрифтов, установленных на устройстве:
import pygame
pygame.init()
print( pygame.font.get_fonts() )
И выберем первый
из них:
f_sys = pygame.font.SysFont('arial', 12)
На выходе
получим экземпляр класса Font, на который ссылается переменная f_sys. Далее, уже
используя эту переменную, мы можем работать с выбранным шрифтом.
Аналогично
используется и второй класс:
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
только здесь мы
указываем полный путь к шрифту (обычно, это какой-либо нестандартный шрифт,
который мы хотим использовать в нашей программе). Давайте нарисуем с его
помощью текст. Программа будет выглядеть так:
import pygame
pygame.init()
W, H = 600, 400
sc = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Шрифты")
pygame.display.set_icon(pygame.image.load("app.bmp"))
clock = pygame.time.Clock()
FPS = 60
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (239, 228, 176)
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
sc_text = f.render('Привет мир!', 1, RED, YELLOW)
pos = sc_text.get_rect(center=(W//2, H//2))
sc.fill(WHITE)
sc.blit(sc_text, pos)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
clock.tick(FPS)
Смотрите, сначала
вызывается метод render чтобы сформировать слой Surface, на котором
будет написан текст «Привет мир!» выбранным шрифтом. Параметр 1 говорит, что
нужно выполнять сглаживание границ букв (0 – без сглаживания), затем идет цвет
текст и цвет фона. После этого мы получаем координаты прямоугольной области
поверхности sc_text, расположенной
по центру клиентской области окна приложения. И далее, с помощью уже известного
метода blit отображаем текст
в окне. Результат работы программы выглядит так:
Вот такие
действия нужно выполнить для отображения текста в Pygame. Однако, если
мы хотим использовать шрифт по умолчанию, используемый в этой библиотеке, то
вместо имени шрифта, в приведенных выше классах, следует указывать значение None, например:
f = pygame.font.Font(None, 24)
В заключение
этого занятия я приведу пример простой программы по перемещению изображения
текста с помощью мышки (lesson 7.text_move.py: https://github.com/selfedu-rus/pygame):
import pygame
pygame.init()
W, H = 600, 400
sc = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Шрифты")
pygame.display.set_icon(pygame.image.load("app.bmp"))
clock = pygame.time.Clock()
FPS = 60
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (239, 228, 176)
print( pygame.font.get_fonts() )
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
sc_text = f.render('Привет мир!', 1, RED, YELLOW)
pos = sc_text.get_rect(center=(W//2, H//2))
def draw_text():
sc.fill(WHITE)
sc.blit(sc_text, pos)
pygame.display.update()
draw_text()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
pygame.mouse.get_rel() # обнуляем первое смещение (при повторном вызове ниже)
if pygame.mouse.get_focused() and pos.collidepoint(pygame.mouse.get_pos()):
btns = pygame.mouse.get_pressed()
if btns[0]: # нажата левая кнопка мыши
rel = pygame.mouse.get_rel() # получаем смещение
pos.move_ip(rel)
draw_text()
clock.tick(FPS)
Смотрите, в
главном цикле мы проверяем: находится ли курсор мыши в области окна приложения
и располагается ли над текстом. Если это так, то далее проверяем: нажата ли
левая кнопка мыши и при истинности проверки получаем смещение курсора мыши.
Причем, первое смещение будет нулевым, т.к. выше при проверке события MOUSEBUTTONDOWN мы вызываем эту
же функцию get_rel(), поэтому при ее повторном вызове она возвратит нулевые
смещения. Далее, смещая курсор мыши переменная rel будет ссылаться
на кортеж из значений смещения по координатам X и Y. Мы используем
этот кортеж, чтобы изменить положение прямоугольника pos и отобразить
текст с этими новыми координатами с помощью функции draw_text().
Вот так довольно
просто выполняется работа с текстом в Pygame.