Стрельба
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()
: