В методе prep_score() преобразуем числовое значение stats.score в строку (1) ; эта строка передается методу render(), создающему изображение (2). Чтобы счет был хорошо виден на экране, мы передаем render() цвет фона и цвет текста.
Счет размещается в правой верхней части экрана и расширяется влево с ростом значения и ширины числа. Чтобы счет всегда оставался выровненным по правой стороне, мы создаем прямоугольник rect с именем score_rect (3) и смещаем его правую сторону на 20 пикселов от правого края экрана (4). Затем верхняя сторона прямоугольника смещается на 20 пикселов вниз от верхнего края экрана (5).
Остается создать метод 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)
(1) . .sb = Scoreboard(ai_settings, screen, stats)
...
# Запуск основного цикла игры.
while True:
...
(2) . . . .gf.update_screen(ai_settings, screen, stats, sb, ship, aliens,
. . . . . .bullets, play_button)
run_game()
Мы импортируем новый класс Scoreboard и создаем экземпляр sb после создания экземпляра stats (1) . Затем экземпляр sb передается методу update_screen(), чтобы счет можно было вывести на экран (2).
Для отображения счета метод 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 изображено окно игры перед ее началом.
Рис. 14.2.
Счет отображается в правом верхнем углу экранаА теперь нужно организовать начисление очков за каждого пришельца!
Обновление счета при уничтожении пришельцев
Чтобы на экране выводился оперативно обновляемый счет, мы будем обновлять значение stats.score при каждом попадании в пришельца, а затем вызывать prep_score() для обновления изображения счета. Но сначала нужно определить, сколько очков игрок будет получать за каждого пришельца:
settings.py
def initialize_dynamic_settings(self):
...
. .# Подсчет очков
. .self.alien_points = 50
Стоимость каждого пришельца в очках будет увеличиваться по ходу игры. Чтобы значение сбрасывалось в начале каждой новой игры, мы задаем значение в initialize_dynamic_settings().
Счет будет обновляться за каждого сбитого пришельца в check_bullet_alien_collisions():
game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
. . . .aliens, bullets):
"""Обработка коллизий пуль с пришельцами."""
# Удаление пуль и пришельцев, участвующих в коллизиях.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
. .if collisions:
(1) . . . .stats.score += ai_settings.alien_points
. . . .sb.prep_score()
...
Мы обновляем определение check_bullet_alien_collisions() и включаем параметры stats и sb, чтобы функция могла обновлять счет и рекорд. При попадании пули в пришельца Pygame возвращает словарь collisions. Программа проверяет, существует ли словарь, и если существует — стоимость пришельца добавляется к счету (1) . Затем вызов prep_score() создает новое изображение для обновленного счета.
Также необходимо обновить определение update_bullets(), чтобы соответствующие аргументы передавались между функциями:
game_functions.py
def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):
"""Обновляет позиции пуль и удаляет старые пули."""
...
. .check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
. . . .aliens, bullets)
Определению update_bullets() необходимы дополнительные параметры stats и sb. Кроме того, вызов check_bullet_alien_collisions() должен включать аргументы stats и sb.
Также необходимо изменить вызов update_bullets() в основном цикле while:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, play_button, ship,
aliens, bullets)
if stats.game_active:
ship.update()
. . . .gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
. . . . . .bullets)
...
При вызове update_bullets() должны передаваться аргументы stats и sb.
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT