Модуль pygame.font

Классы Font и SysFont находятся в модуле pygame.font и предназначены для работы со шрифтами и текстом.

От классов pygame.font.Font и pygame.font.SysFont создаются объекты-шрифты. Второй класс берет системные шрифты, поэтому конструктору достаточно передать имя шрифта. Конструктору Font надо передавать имя файла шрифта. Например:

pygame.font.SysFont('arial', 36)
pygame.font.Font('/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 36)

Второй аргумент – это размер шрифта в пикселях.

Узнать, какие шрифты есть в системе, можно с помощью функции get_fonts():

>>> pygame.font.get_fonts()
['cmmi10', 'umeminchos3', 'kacstbook', 'freesans', 'lohitpunjabi', ... 

Узнать адрес конкретного шрифта:

>>> pygame.font.match_font('verdana')
'/usr/share/fonts/truetype/msttcorefonts/Verdana.ttf'

Вы можете скопировать шрифт в каталог программы и обращаться к нему без адреса:

pygame.font.Font('Verdana.ttf', 24)

В pygame есть шрифт по-умолчанию. Чтобы использовать его, вместо имени файла в конструктор надо передать объект None:

pygame.font.Font(None, 24)

От обоих классов (Font и SysFont) создаются объекты типа Font.

Метод render() экземпляра Font создает поверхность (экземпляр Surface), на которой "написан" переданный в качестве аргумента текст, шрифтом, к которому применяется метод. Вторым аргументом указывается сглаживание (0 – нет, 1 – есть), третьим – цвет текста. При необходимости четвертым аргументом можно указать цвет фона.

import pygame
pygame.init()
 
sc = pygame.display.set_mode((300,200))
sc.fill((255, 255, 255))
 
f1 = pygame.font.Font(None, 36)
text1 = f1.render('Hello Привет', 1, (180, 0, 0))
 
f2 = pygame.font.SysFont('serif', 48)
text2 = f2.render("World Мир", 0, (0, 180, 0))
 
sc.blit(text1, (10, 50))
sc.blit(text2, (10, 100))
 
pygame.display.update()
 
while 1:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            exit()

Текст в Pygame

Рассмотрим такой пример:

import pygame
pygame.init()
 
sc = pygame.display.set_mode((400, 300))
sc.fill((200, 255, 200))
 
font = pygame.font.Font(None, 72)
text = font.render("Hello Wold", 1, (0, 100, 0))
place = text.get_rect(center=(200, 150))
sc.blit(text, place)
 
pygame.display.update()
 
while 1:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            exit()
 
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        place.x -= 1
    elif pressed[pygame.K_RIGHT]:
        place.x += 1
 
    sc.fill((200, 255, 200))
    sc.blit(text, place)
 
    pygame.display.update()
 
    pygame.time.delay(20)

Центрирование текста в Pygame

Вспомним, что метод get_rect() экземпляра Surface возвращает объект типа Rect, чьи размеры соответствуют размерам поверхности.

Поскольку у самой поверхности нет собственных свойств-координат на родительском окне, а у Rect они есть, то по умолчанию, если get_rect() применяется без аргументов, для его верхнего левого угла устанавливаются координаты (0, 0).

В нашем примере мы передаем в get_rect() значение для свойства center порождаемой прямоугольной области. Это свойство определяет координаты центра экземпляра Rect (то, что это еще и центр главного окна, неважно). При этом остальные координаты, в том числе координаты верхнего левого угла, вычисляются автоматически, исходя из установленного центра и размеров поверхности.

Поэтому, когда вызывается метод blit(), в который в качестве второго аргумента передается созданный экземпляр Rect, то из последнего берутся координаты верхнего левого угла. Но они уже не (0, 0), а имеют значения, которые равны свойству centerx минус половина ширины и centery минус половина высоты прямоугольной области или соответствующей ей поверхности.

При зажиме стрелок на клавиатуре координата x прямоугольника меняется. В результате метод blit() рисует поверхность в новых координатах.

Практическая работа

У объектов Rect есть метод contains(), который проверяет, заключает ли в себе одна область (к которой применяется метод) другую (которая передается в качестве аргумента).

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

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Создано

Обновлено