Стрельба
265
alien_invasion.py
def run_game(self):
# Запуск основного цикла игры.
while True:
self._check_events()
self.ship.update()
self.bullets.update()
# Удаление снарядов, вышедших за край экрана.
❶
for bullet in self.bullets.copy():
❷
if bullet.rect.bottom <= 0:
❸
self.bullets.remove(bullet)
❹
print(len(self.bullets))
self._update_screen()
При использовании цикла
for
со списком (или группой в Pygame) Python ожидает,
что список сохраняет постоянную длину во время выполнения цикла. Так как эле-
менты из списка или группы в цикле
for
не должны удаляться, перебирать нужно
копию группы. Метод
copy()
используется для создания цикла
for
, в котором
возможно изменять содержимое
bullets
. Программа проверяет каждый снаряд
и определяет, вышел ли он за верхний край экрана
. Если снаряд пересек гра-
ницу, он удаляется из
bullets
. В точке
добавляется команда
print
, которая
сообщает, сколько снарядов сейчас существует в игре; по выведенному значению
можно убедиться в том, что снаряды действительно удаляются при достижении
верхнего края экрана.
Если код работает правильно, вы можете понаблюдать за выводом на терминале
и убедиться в том, что количество снарядов уменьшается до 0 после того, как
очередной залп уходит за верхний край экрана. После запуска игры, когда вы
убедитесь в том, что снаряды правильно удаляются из группы, удалите команду
print
. Если команда останется в программе, она существенно замедлит игру, по-
тому что вывод на терминал занимает больше времени, чем отображение графики
в игровом окне.
Ограничение количества снарядов
Многие игры-стрелялки ограничивают количество снарядов, одновременно нахо-
дящихся на экране, чтобы у игроков появился стимул стрелять более метко. То же
самое будет сделано и в игре Alien Invasion.
Сначала сохраним максимально допустимое количество снарядов в
settings .py
:
Достарыңызбен бөлісу: