Создание флота
Теперь можно перейти к созданию флота. Ниже приведена новая функция create_fleet(), которую мы поместим в конец game_functions.py. Также необходимо импортировать класс Alien, не забудьте добавить команду import в начало файла:
game_functions.py
...
from bullet import Bullet
from alien import Alien
...
def create_fleet(ai_settings, screen, aliens):
. ."""Создает флот пришельцев."""
. .# Создание пришельца и вычисление количества пришельцев в ряду.
. .# Интервал между соседними пришельцами равен одной ширине пришельца.
(1) . .alien = Alien(ai_settings, screen)
(2) . .alien_width = alien.rect.width
(3) . .available_space_x = ai_settings.screen_width - 2 * alien_width
(4) . .number_aliens_x = int(available_space_x / (2 * alien_width))
. .
. .# Создание первого ряда пришельцев.
(5) . .for alien_number in range(number_aliens_x):
. . . .# Создание пришельца и размещение его в ряду.
? . . . .alien = Alien(ai_settings, screen)
. . . .alien.x = alien_width + 2 * alien_width * alien_number
. . . .alien.rect.x = alien.x
. . . .aliens.add(alien)
Бульшая часть этого кода уже была описана ранее. Для размещения пришельцев необходимо знать ширину и высоту одного пришельца, и мы создаем его в точке (1) перед выполнением вычислений. Этот пришелец не войдет во флот, поэтому он не включается в группу aliens. В точке (2) ширина пришельца определяется по его атрибуту rect, а полученное значение сохраняется в alien_width, чтобы избежать лишних обращений к атрибуту rect. В точке (3) вычисляется горизонтальное пространство и количество пришельцев, которые в нем поместятся.
По сравнению с исходными формулами всего одно изменение: мы используем int(), чтобы вычисленное количество пришельцев (4) было целым, — во-первых, неясно, что делать с неполным пришельцем, а во-вторых, функция range() должна получать целое число. Функция int() отсекает дробную часть числа, фактически выполняя округление в меньшую сторону. (И это правильно: лучше оставить лишнее свободное место в каждом ряду, чем забивать ряды до отказа.)
Затем создается цикл от 0 до количества создаваемых пришельцев (5). В теле цикла создается новый пришелец, после чего задается его координата x для размещения его в ряду ?. Каждый пришелец сдвигается вправо на одну ширину от левого поля. Затем ширина пришельца умножается на 2, чтобы учесть полное пространство, выделенное для одного пришельца, включая пустой интервал справа, а полученная величина умножается на позицию пришельца в ряду. Затем новый пришелец добавляется в группу aliens.
Рис. 13.3. Первый ряд пришельцев
Запустив программу Alien Invasion, вы увидите, что на экране появился первый ряд пришельцев (рис. 13.3).
Первый ряд сдвинут влево, и это хорошо, потому что флот пришельцев должен двигаться вправо, пока не дойдет до края экрана, затем немного опуститься вниз, затем двигаться влево и т.д. Как и в классической игре Space Invaders, такое перемещение интереснее, чем постепенное снижение по прямой. Движение будет продолжаться до тех пор, пока все пришельцы не будут сбиты или пока пришелец не столкнется с кораблем или нижним краем экрана.
примечание
В зависимости от выбранной ширины экрана расположение первого ряда пришельцев в вашей системе может выглядеть немного иначе.