Уничтожение пришельцев
273
Восстановление флота
Одна из ключевых особенностей Alien Invasion — бесконечные орды пришельцев:
каждый раз, когда вы уничтожаете один флот, на его месте появляется другой.
Чтобы после уничтожения одного флота появлялся другой, сначала нужно убе-
диться в том, что группа
aliens
пуста. Если она пуста, вызывается функция
create_
fleet()
. Проверка будет выполняться в функции
update_bullets()
, потому что
именно здесь уничтожаются отдельные пришельцы:
game_functions.py
def update_bullets(ai_settings, screen, ship, aliens, bullets):
...
# Проверка попаданий в пришельцев.
# При обнаружении попадания удалить пулю и пришельца.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if len(aliens) == 0:
# Уничтожение существующих пуль и создание нового флота.
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
В точке программа проверяет, пуста ли группа
aliens
. Если она пуста, то все
существующие пули удаляются методом
empty()
, который удаляет все существу-
ющие спрайты из группы . Вызов метода
create_fleet()
снова заполняет экран
пришельцами.
В определении
update_bullets()
теперь появились дополнительные параметры
ai_settings
,
screen
и
ship
, поэтому вызов
update_bullets()
в
alien_invasion .py
не-
обходимо обновить:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
gf.update_aliens(ai_settings, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Новый флот появляется сразу же после уничтожения текущего флота.
Ускорение пуль
Попытавшись стрелять по пришельцам в текущем состоянии игры, вы заметите,
что движение пуль немного замедлилось. Дело в том, что Pygame теперь выполняет
больший объем работы при каждом проходе цикла. Скорость пуль можно увели-
чить настройкой
bullet_speed_factor
в
settings .py
. Если увеличить это значение
(например, до 3), пули снова будут двигаться по экрану с разумной скоростью:
settings.py
# Настройки пуль
274 Глава 13 • Осторожно, пришельцы!
self.bullet_speed_factor = 3
self.bul
...
Оптимальное значение этой настройки зависит от производительности вашей
системы. Найдите значение, которое лучше подходит для вашей конкретной кон-
фигурации.
Рефакторинг update_bullets()
Переработаем функцию
update_bullets()
, чтобы она не решала такое количество
разных задач. Код обработки коллизий будет выделен в отдельную функцию:
game_functions.py
def update_bullets(ai_settings, screen, ship, aliens, bullets):
...
# Уничтожение исчезнувших пуль.
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)
def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
"""Обработка коллизий пуль с пришельцами."""
# Удаление пуль и пришельцев, участвующих в коллизиях.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if len(aliens) == 0:
# Уничтожение существующих пуль и создание нового флота.
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
Мы создали новую функцию
check_bullet_alien_collisions()
для выявления
коллизий между пулями и пришельцами и для реакции на уничтожение всего
флота. Это сделано для того, чтобы сократить длину функции
update_bullets()
и упростить дальнейшую разработку.
Достарыңызбен бөлісу: