Модуль 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-версия