. ."""Запускает новую игру при нажатии кнопки Play."""
(4) . .if play_button.rect.collidepoint(mouse_x, mouse_y):
. . . .stats.game_active = True
Обновленное определение check_events() получает параметры stats и play_button. Параметр stats будет использоваться для обращения к флагу game_active, а play_button — для проверки того, была ли нажата кнопка Play.
Pygame обнаруживает событие MOUSEBUTTONDOWN, когда игрок щелкает в любой точке экрана (1) , но мы хотим ограничить игру, чтобы она реагировала только на щелчки на кнопке Play. Для этого будет использоваться метод pygame.mouse.get_pos(), возвращающий кортеж с координатами x и y точки щелчка (2). Эти значения передаются функции check_play_button() (3), которая использует метод collidepoint() для проверки того, находится ли точка щелчка в пределах области, определяемой прямоугольником кнопки Play (4). Если точка находится в пределах кнопки, флаг game_active переводится в состояние True, и игра начинается!
При вызове check_events() в alien_invasion.py должны передаваться два дополнительных аргумента, stats и play_button:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, play_button, ship,
. . bullets)
...
К этому моменту вы сможете запустить и сыграть полноценную игру. После завершения игры значение game_active становится равным False, а кнопка Play снова появится на экране.
Только что написанный нами код работает при первом нажатии кнопки Play, но не работает после завершения первой игры, потому что условия, приводящие к окончанию игры, еще не были сброшены.
Чтобы игра сбрасывалась при каждом нажатии кнопки Play, необходимо сбросить игровую статистику, стереть старых пришельцев и пули, построить новый флот и вернуть корабль в центр нижней стороны:
game_functions.py
def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
. . . .bullets, mouse_x, mouse_y):
"""Запускает новую игру при нажатии кнопки Play."""
if play_button.rect.collidepoint(mouse_x, mouse_y):
. . . .# Сброс игровой статистики.
(1) . . . .stats.reset_stats()
stats.game_active = True
. . . .
. . . .# Очистка списков пришельцев и пуль.
(2) . . . .aliens.empty()
. . . .bullets.empty()
. . . .
. . . .# Создание нового флота и размещение корабля в центре.
(3) . . . .create_fleet(ai_settings, screen, ship, aliens)
. . . .ship.center_ship()
Мы обновляем определение check_play_button(), чтобы в нем были доступны объекты ai_settings, stats, ship, aliens и bullets. Эти объекты необходимы для сброса настроек, изменившихся в ходе игры, и для обновления визуальных элементов игры.
В точке (1) обновляется игровая статистика, вследствие чего игрок получает три новых корабля. После этого флаг game_active переводится в состояние True (чтобы игра началась сразу же после выполнения кода функции), группы aliens и bullets очищаются (2), создается новый флот, а корабль выравнивается по центру (3).
Для этого необходимо изменить определение check_events(), как и вызов check_play_button():
game_functions.py
def check_events(ai_settings, screen, stats, play_button, ship, aliens,
. . . .bullets):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
...
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
(1) . . . . . .check_play_button(ai_settings, screen, stats, play_ button, ship,
. . . . . . . .aliens, bullets, mouse_x, mouse_y)
Определению check_events() необходим параметр aliens, который будет передаваться check_play_button(). Также обновляется вызов check_play_button() с включением соответствующих аргументов (1) .
Теперь обновите вызов check_events() в alien_invasion.py, чтобы в нем передавался аргумент aliens:
alien_invasion.py
# Запуск основного цикла игры.
while True:
. .gf.check_events(ai_settings, screen, stats, play_button, ship,
. . . .aliens, bullets)
...
После этих изменений игра будет правильно переходить в исходное состояние при каждом нажатии Play, и вы сможете сыграть столько раз, сколько вам захочется!
У кнопки Play в нашем приложении есть одна проблема: область кнопки на экране продолжает реагировать на щелчки, даже если кнопка Play не отображается. Если случайно щелкнуть на месте кнопки Play после начала игры, то игра перезапустится!
Чтобы исправить этот недостаток, следует запускать игру только в том случае, если флаг game_active находится в состоянии False:
game_functions.py
def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
bullets, mouse_x, mouse_y):
"""Запускает новую игру при нажатии кнопки Play."""
(1) . .button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
(2) . .if button_clicked and not stats.game_active:
# Сброс игровой статистики.
...