Создание класса Button

We use cookies. Read the Privacy and Cookie Policy

Так как в 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 готов.