УПРАЖНЕНИЯ
14-3 . Учебная стрельба с нарастающей сложностью: начните с кода упражнения 14-2
(с . 288) . Скорость мишени должна увеличиваться по ходу игры, а при нажатии игроком
кнопки Play мишень должна возвращаться к исходной скорости .
Подсчет очков 291
Подсчет очков
Система подсчета очков позволит отслеживать счет игры в реальном времени; так-
же на экране будет выводиться текущий рекорд, уровень и количество оставшихся
кораблей. Счет игры также относится к игровой статистике, поэтому мы добавим
атрибут
score
в класс
GameStats
:
game_stats.py
class GameStats():
...
def reset_stats(self):
"""Инициализирует статистику, изменяющуюся в ходе игры."""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
Чтобы счет сбрасывался при запуске новой игры, мы инициализируем
score
в
reset_stats()
вместо
__init__()
.
Вывод счета
Чтобы вывести счет на экран, мы сначала создаем новый класс
Scoreboard
. Пока
этот класс ограничивается выводом текущего счета, но мы используем его для вы-
вода рекордного счета, уровня и количества оставшихся кораблей. Ниже приведена
первая часть класса; сохраните ее под именем
scoreboard .py
:
scoreboard.py
import pygame.font
class Scoreboard():
"""Класс для вывода игровой информации."""
def __init__(self, ai_settings, screen, stats):
"""Инициализирует атрибуты подсчета очков."""
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
# Настройки шрифта для вывода счета.
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48)
# Подготовка исходного изображения.
self.prep_score()
Так как
Scoreboard
выводит текст на экран, код начинается с импортирования
модуля
pygame.font
. Затем
__init__()
передаются параметры
ai_settings
,
screen
и
stats
, чтобы класс мог выводить информацию об отслеживаемых показателях .
Далее назначается цвет текста и создается экземпляр объекта шрифта .
Чтобы преобразовать выводимый текст в изображение, мы вызываем метод
prep_
score()
, который определяется следующим образом:
scoreboard.py
def prep_score(self):
"""Преобразует текущий счет в графическое изображение."""
292 Глава 14 • Ведение счета
score_str = str(self.stats.score)
self.score_image = self.font.render(score_str, True, self.
text_color,
self.ai_settings.bg_color)
# Вывод счета в правой верхней части экрана.
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 20
В методе
prep_score()
преобразуем числовое значение
stats.score
в строку ; эта
строка передается методу
render()
, создающему изображение . Чтобы счет был
хорошо виден на экране, мы передаем
render()
цвет фона и цвет текста.
Счет размещается в правой верхней части экрана и расширяется влево с ростом
значения и ширины числа. Чтобы счет всегда оставался выровненным по правой
стороне, мы создаем прямоугольник
rect
с именем
score_rect
и смещаем его
правую сторону на 20 пикселов от правого края экрана . Затем верхняя сторона
прямоугольника смещается на 20 пикселов вниз от верхнего края экрана .
Остается создать метод
show_score()
для вывода построенного графического изо-
бражения:
scoreboard.py
def show_score(self):
"""Выводит счет на экран."""
self.screen.blit(self.score_image, self.score_rect)
Метод выводит счет на экран в позиции, определяемой
score_rect
.
Создание экземпляра Scoreboard
Чтобы вывести счет, мы создадим в
alien_invasion .py
экземпляр
Scoreboard
:
alien_invasion.py
...
from game_stats import GameStats
from scoreboard import Scoreboard
...
def run_game():
...
# Создание экземпляров GameStats и Scoreboard.
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings, screen, stats)
...
# Запуск основного цикла игры.
while True:
...
gf.update_screen(ai_settings, screen, stats, sb, ship,
aliens,
bullets, play_button)
run_game()
Подсчет очков 293
Мы импортируем новый класс
Scoreboard
и создаем экземпляр
sb
после создания
экземпляра
stats
. Затем экземпляр
sb
передается методу
update_screen()
, чтобы
счет можно было вывести на экран .
Для отображения счета метод
update_screen()
изменяется следующим образом:
game_functions.py
def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
play_button):
...
# Вывод счета.
sb.show_score()
# Кнопка Play отображается в том случае, если игра неактивна.
if not stats.game_active:
play_button.draw_button()
# Отображение последнего прорисованного экрана.
pygame.display.flip()
Мы добавляем
sb
в список параметров, определяющих
update_screen()
, и вызыва-
ем
show_score()
непосредственно перед отображением кнопки
Play
.
Если запустить Alien Invasion сейчас, в правом верхнем углу экрана отображается
счет 0. (Пока мы просто хотим убедиться в том, что счет отображается в нужном
месте, прежде чем заниматься дальнейшей доработкой системы подсчета очков.)
На рис. 14.2 изображено окно игры перед ее началом.
Достарыңызбен бөлісу: |