Модуль pygame.font

Классы Font и SysFont находятся в модуле pygame.font и предназначены для работы со шрифтами и текстом. Чтобы создавать от этих классов объекты, модуль pygame.font необходимо предварительно инициализировать командой pygame.font.init(), или выполнить инициализацию всех вложенных модулей библиотеки Pygame командой pygame.init().

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

pygame.font.SysFont('arial', 36)
pygame.font.Font('/адрес/Arial.ttf', 36)

Пример полного адреса в системе Linux – "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf".

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

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

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

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

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

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

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

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

pygame.font.Font(None, 24)

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

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

import pygame
import sys
pygame.font.init()
 
sc = pygame.display.set_mode((300, 200))
sc.fill((255, 255, 255))
 
f1 = pygame.font.Font(None, 36)
text1 = f1.render('Hello Привет', True,
                  (180, 0, 0))
 
f2 = pygame.font.SysFont('serif', 48)
text2 = f2.render("World Мир", False,
                  (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:
            sys.exit()
 

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

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

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

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

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

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

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

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

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

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

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


Pygame. Введение в разработку игр на Python




Все разделы сайта