Обработка выстрелов
В файле game_functions.py необходимо внести изменения в метод check_keydown_events(), чтобы при нажатии клавиши «пробел» происходил выстрел. Изменять check_keyup_events() не нужно, потому что при отпускании клавиши ничего не происходит. Также необходимо изменить update_screen() и вывести каждую пулю на экран перед вызовом flip(). Ниже представлены соответствующие изменения в game_functions.py:
game_functions.py
...
from bullet import Bullet
(1) def check_keydown_events(event, ai_settings, screen, ship, bullets):
...
(2) . .elif event.key == pygame.K_SPACE:
. . . .# Создание новой пули и включение ее в группу bullets.
. . . .new_bullet = Bullet(ai_settings, screen, ship)
. . . .bullets.add(new_bullet)
...
(3)def check_events(ai_settings, screen, ship, bullets):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
...
elif event.type == pygame.KEYDOWN:
. . . . . .check_keydown_events(event, ai_settings, screen, ship, bullets)
...
(4)def update_screen(ai_settings, screen, ship, bullets):
...
. .# Все пули выводятся позади изображений корабля и пришельцев.
(5) . .for bullet in bullets.sprites():
. . . .bullet.draw_bullet()
ship.blitme()
...
Рис. 12.3. Экран игры после серии выстрелов
Группа bullets передается check_keydown_events() (1) . Когда игрок нажимает пробел, создается новая пуля (экземпляр Bullet с именем new_bullet), которая добавляется в группу bullets (2) методом add(); код bullets.add(new_bullet) сохраняет новую пулю в группе bullets.
Группу bullets необходимо добавить в число параметров в определении check_events() (3), а также передать в аргументе при вызове check_keydown_events().
Параметр bullets передается функции update_screen() (4), которая рисует пули на экране. Метод bullets.sprites() возвращает список всех спрайтов в группе bullets. Чтобы нарисовать все выпущенные пули на экране, программа перебирает спрайты в bullets и вызывает для каждого draw_bullet() (5).
Если запустить alien_invasion.py сейчас, вы сможете двигать корабль влево и вправо и выпускать сколько угодно пуль. Пули перемещаются вверх по экрану и исчезают при достижении верхнего края (рис. 12.3). Размер, цвет и скорость пуль можно изменить при помощи настроек в settings.py.