252
Глава 12 • Стреляющий корабль
Рис. 12.3.
Экран игры после серии выстрелов
Группа
bu
llets
передается
check_keydown_events()
. Когда игрок нажимает про-
бел, создается новая пуля (экземпляр
Bullet
с именем
new_bullet
), которая добав-
ляется в группу
bullets
методом
add()
; код
bullets.add(new_bullet)
сохраняет
новую пулю в группе
bullets
.
Группу
bullets
необходимо добавить в число параметров в определении
check_events()
, а также передать в аргументе при вызове
check_keydown_
events()
.
Параметр
bullets
передается функции
update_screen()
, которая рисует пули
на экране. Метод
bullets.sprites()
возвращает список всех спрайтов в группе
bullets
. Чтобы нарисовать все выпущенные пули на экране, программа перебирает
спрайты в
bullets
и вызывает для каждого
draw_bullet()
.
Если запустить
alien_invasion .py
сейчас, вы сможете двигать корабль влево и вправо
и выпускать сколько угодно пуль. Пули перемещаются вверх по экрану и исчезают
при достижении верхнего края (рис. 12.3). Размер, цвет и скорость пуль можно из-
менить при помощи настроек в
settings .py
.
Удаление старых пуль
На данный момент пули исчезают по достижении верхнего края, но только потому,
что Pygame не может нарисовать их выше края экрана. На самом деле пули про-
должают существовать; их координата
y
продолжает уменьшаться. И это создает
проблему, потому что пули продолжают потреблять память и вычислительные
мощности.
Стрельба
253
От старых пуль необходимо избавиться, иначе игра замедлится из-за большого
объема лишней работы. Для этого необходимо определить момент, когда атрибут
bottom
прямоугольника пули достигнет 0, — это означает, что пуля вышла за верх-
ний край экрана:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
bullets.update()
# Удаление пуль, вышедших за край экрана.
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
print(len(bullets))
gf.update_screen(ai_settings, screen, ship, bullets)
Удалять элементы из списка или группы в цикле
for
не следует, поэтому переби-
рать нужно копию группы. Метод
copy()
используется для создания цикла
for
,
в котором возможно изменять содержимое
bullets
. Программа проверяет каждую
пулю и определяет, вышла ли она за верхний край экрана
. Если пуля пересекла
границу, она удаляется из
bullets
. В точке
добавляется команда
print
, которая
сообщает, сколько пуль сейчас существует в игре; по выведенному значению можно
убедиться в том, что пули действительно были удалены.
Если код работает правильно, вы можете понаблюдать за выводом на терминале
и убедиться в том, что количество пуль уменьшается до 0 после того, как очередной
залп уходит за верхний край экрана. После того как вы запустите игру и убедитесь
в том, что пули правильно удаляются из группы, удалите команду
print
. Если ко-
манда останется в программе, она существенно замедлит игру, потому что вывод
на терминал занимает больше времени, чем отображение графики в игровом окне.
Ограничение количества пуль
Многие игры-«стрелялки» ограничивают количество пуль, одновременно находя-
щихся на экране, чтобы у игроков появился стимул стрелять более метко. То же
самое будет сделано и в игре Alien Invasion.
Сначала сохраним максимально допустимое количество пуль в
settings .py
:
settings.py
# Параметры пули
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3
В любой момент времени на экране может находиться не более трех пуль. Эта на-
стройка будет использоваться в
game_functions .py
для проверки количества суще-
ствующих пуль перед созданием новой пули в
check_keydown_events()
:
254
Достарыңызбен бөлісу: |