. . . .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 готов.
Вывод кнопки на экран
В программе класс Button используется для создания кнопки Play. Так как нам нужна только одна кнопка Play, мы создадим кнопку прямо в файле alien_invasion.py:
alien_invasion.py
...
from game_stats import GameStats
from button import Button
...
def run_game():
...
pygame.display.set_caption("Alien Invasion")
. .
. .# Создание кнопки Play.
(1) . .play_button = Button(ai_settings, screen, "Play")
...
# Запуск основного цикла игры.
while True:
...
(2) . . . .gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets,
. . . . . .play_button)
run_game()
Программа импортирует класс Button и создает экземпляр play_button (1) , после чего передает play_button функции update_screen(), чтобы кнопка появлялась при обновлении экрана (2).
Затем следует внести изменения в update_screen(), чтобы кнопка Play появлялась только в неактивном состоянии игры:
game_functions.py
def update_screen(ai_settings, screen, stats, ship, aliens, bullets,
. . . .play_button):
"""Обновляет изображения на экране и отображает новый экран."""
...
. .
. .# Кнопка Play отображается в том случае, если игра неактивна.
. .if not stats.game_active:
. . . .play_button.draw_button()
. . . . . .
# Отображение последнего прорисованного экрана.
pygame.display.flip()
Чтобы кнопка Play не закрывалась другими элементами экрана, мы отображаем ее после всех остальных игровых элементов, но перед переключением на новый экран. Теперь при запуске Alien Invasion в центре экрана отображается кнопка Play (рис. 14.1).
Рис. 14.1. Кнопка Play выводится тогда, когда игра неактивна
Запуск игры
Чтобы при нажатии кнопки Play запускалась новая игра, добавьте в файл game_functions.py следующий код для отслеживания событий мыши над кнопкой:
game_functions.py
def check_events(ai_settings, screen, stats, play_button, ship, bullets):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
...
(1) . . . .elif event.type == pygame.MOUSEBUTTONDOWN:
(2) . . . . . .mouse_x, mouse_y = pygame.mouse.get_pos()
(3) . . . . . .check_play_button(stats, play_button, mouse_x, mouse_y)
def check_play_button(stats, play_button, mouse_x, mouse_y):