Снижение флота и смена направления
Когда пришелец доходит до края, весь флот должен опуститься вниз и изменить направление движения. Это означает, что в game_functions.py необходимо внести серьезные изменения, потому что именно здесь программа проверяет, достиг ли какой-либо пришелец левого или правого края. Для этого мы напишем функции check_fleet_edges() и change_fleet_direction(), а затем изменим update_aliens():
game_functions.py
def check_fleet_edges(ai_settings, aliens):
. ."""Реагирует на достижение пришельцем края экрана."""
(1) . .for alien in aliens.sprites():
. . . .if alien.check_edges():
. . . . . .change_fleet_direction(ai_settings, aliens)
. . . . . .break
def change_fleet_direction(ai_settings, aliens):
. ."""Опускает весь флот и меняет направление флота."""
. .for alien in aliens.sprites():
(2) . . . .alien.rect.y += ai_settings.fleet_drop_speed
. .ai_settings.fleet_direction *= -1
. . . . . . . .
def update_aliens(ai_settings, aliens):
. ."""
. .Проверяет, достиг ли флот края экрана,
. . после чего обновляет позиции всех пришельцев во флоте.
. ."""
(3) . .check_fleet_edges(ai_settings, aliens)
aliens.update()
Функция check_fleet_edges() перебирает флот и вызывает check_edges() для каждого пришельца (1) . Если check_edges() возвращает True, значит, пришелец находится у края и весь флот должен сменить направление, поэтому вызывается функция change_fleet_direction() и происходит выход из цикла. Функция change_fleet_direction() перебирает пришельцев и уменьшает высоту каждого из них с использованием настройки fleet_drop_speed (2); затем направление fleet_direction меняется на противоположное, для чего текущее значение умножается на –1.
Мы изменили функцию update_aliens() и включили в нее проверку нахождения пришельцев у края вызовом check_fleet_edges() (3). Функция должна получать параметр ai_settings, поэтому аргумент ai_settings включается в вызов update_aliens():
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
gf.update_bullets(bullets)
. . gf.update_aliens(ai_settings, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Если запустить игру сейчас, флот будет двигаться влево-вправо между краями экрана и опускаться каждый раз, когда он доберется до края. Теперь можно переходить к реализации уничтожения и отслеживания пришельцев, сталкивающихся с кораблем или достигающих нижнего края экрана.
Упражнения
13-3. Капли: найдите изображение дождевой капли и создайте сетку из капель. Капли должны постепенно опускаться вниз и исчезать у нижнего края экрана.
13-4. Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение.