Глава 14 • Ведение счета
"""Запускает новую игру при нажатии кнопки Play."""
if play_button.rect.collidepoint(mouse_x, mouse_y):
# Сброс игровой статистики.
stats.reset_stats()
stats.game_active = True
# Очистка списков пришельцев и пуль.
aliens.empty()
bullets.empty()
# Создание нового флота и размещение корабля в центре.
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
Мы обновляем определение
check_play_button()
, чтобы в нем были доступны
объекты
ai_settings
,
stats
,
ship
,
aliens
и
bullets
. Эти объекты необходимы для
сброса настроек, изменившихся в ходе игры, и для обновления визуальных эле-
ментов игры.
В точке
обновляется игровая статистика, вследствие чего игрок получает
три новых корабля. После этого флаг
game_active
переводится в состояние
True
(чтобы игра началась сразу же после выполнения кода функции), группы
aliens
и
bullets
очищаются
, создается новый флот, а корабль выравнивается
по центру
.
Для этого необходимо изменить определение
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()
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()
с включением соответствующих аргументов
.
Теперь обновите вызов
check_events()
в
alien_invasion .py
, чтобы в нем передавался
аргумент
aliens
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, stats, play_button, ship,
aliens, bullets)
...
Добавление кнопки Play
287
После этих изменений игра будет правильно переходить в исходное состояние при
каждом нажатии
Play
, и вы сможете сыграть столько раз, сколько вам захочется!
Блокировка кнопки 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."""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
# Сброс игровой статистики.
...
Флаг
button_clicked
содержит значение
True
или
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."""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
# Указатель мыши скрывается.
pygame.mouse.set_visible(False)
...
Вызов
set_visible()
со значением
False
приказывает Pygame скрыть указатель,
когда он находится над окном игры.
После завершения игры указатель должен появляться снова, чтобы игрок мог на-
жать кнопку
Play
для запуска новой игры. Эту задачу решает следующий код:
game_functions.py
def ship_hit(ai_settings, screen, stats, ship, aliens, bullets):
288
Достарыңызбен бөлісу: |