Создание класса Button
Так как в Pygame не существует встроенного метода создания кнопок, мы напишем класс Button для создания заполненного прямоугольника с текстовой надписью. Следующий код может использоваться для создания кнопок в любой игре. Ниже приведена первая часть класса Button; сохраните ее в файле button.py:
button.py
import pygame.font
class Button():
(1) . .def __init__(self, ai_settings, screen, msg):
. . . ."""Инициализирует атрибуты кнопки."""
. . . .self.screen = screen
. . . .self.screen_rect = screen.get_rect()
. . . .
. . . .# Назначение размеров и свойств кнопок.
(2) . . . .self.width, self.height = 200, 50
. . . .self.button_color = (0, 255, 0)
. . . .self.text_color = (255, 255, 255)
(3) . . . .self.font = pygame.font.SysFont(None, 48)
. . . .
. . . .# Построение объекта rect кнопки и выравнивание по центру экрана.
(4) . . . .self.rect = pygame.Rect(0, 0, self.width, self.height)
. . . .self.rect.center = self.screen_rect.center
. . . .
. . . .# Сообщение кнопки создается только один раз.
(5) . . . .self.prep_msg(msg)
Сначала программа импортирует модуль pygame.font, который позволяет Pygame выводить текст на экран. Метод __init__() получает параметры self, объекты ai_settings и screen, а также строку msg с текстом кнопки (1) . Размеры кнопки задаются в точке (2), после чего атрибуты button_color и text_color задаются так, чтобы прямоугольник кнопки был окрашен в ярко-зеленый цвет, а текст выводился белым цветом.
В точке (3) происходит подготовка атрибута font для вывода текста. Аргумент None сообщает Pygame, что для вывода текста должен использоваться шрифт по умолчанию, а значение 48 определяет размер текста. Чтобы выровнять кнопку по центру экрана, мы создаем объект rect для кнопки (4) и задаем его атрибут center в соответствии с одноименным атрибутом экрана.
Pygame выводит строку текста в виде графического изображения. В точке (5) эта задача решается методом prep_msg(). Код prep_msg() выглядит так:
button.py
def prep_msg(self, msg):
. ."""Преобразует msg в прямоугольник и выравнивает текст по центру."""
(1) . .self.msg_image = self.font.render(msg, True, self.text_color,
. . . .self.button_color)
(2) . .self.msg_image_rect = self.msg_image.get_rect()
. .self.msg_image_rect.center = self.rect.center
Метод prep_msg() должен получать параметр self и текст, который нужно вывести в графическом виде (msg). Вызов font.render() преобразует текст, хранящийся в msg, в изображение, которое затем сохраняется в msg_image (1) . Методу font.render() также передается логический признак режима сглаживания текста. В остальных аргументах передаются цвет шрифта и цвет фона. В нашем примере режим сглаживания включен (True), а цвет фона совпадает с цветом фона кнопки. (Если цвет фона не указан, Pygame пытается вывести шрифт с прозрачным фоном.)
В точке (3) изображение текста выравнивается по центру кнопки, для чего создается объект rect изображения, а его атрибут center приводится в соответствие с одноименным атрибутом кнопки.
Остается создать метод draw_button(), который может вызываться для отображения кнопки на экране:
button.py
def draw_button(self):
. .# Отображение пустой кнопки и вывод сообщения.
. .self.screen.fill(self.button_color, self.rect)
. .self.screen.blit(self.msg_image, self.msg_image_rect)
Вызов метода screen.fill() рисует прямоугольную часть кнопки. Затем вызов screen.blit() выводит изображение текста на экран с передачей изображения и объекта rect, связанного с изображением. Класс Button готов.