М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет192/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   188   189   190   191   192   193   194   195   ...   334
Байланысты:
Изучаем Python


Глава 12 • Инопланетное вторжение
Метод 
bullets.sprites()
возвращает список всех спрайтов в группе 
bullets
. Что-
бы нарисовать все выпущенные снаряды на экране, программа перебирает спрайты 
в 
bullets
и вызывает для каждого 
draw_bullet()

.
Если запустить 
alien_invasion .py
сейчас, вы сможете двигать корабль влево и вправо 
и выпускать сколько угодно снарядов. Снаряды перемещаются вверх по экрану 
и исчезают при достижении верхнего края (рис. 12.3). Размер, цвет и скорость 
можно изменить при помощи настроек в 
settings .py
.
Рис. 12.3.
Экран игры после серии выстрелов
Удаление старых снарядов
На данный момент снаряды исчезают при достижении верхнего края, но только 
потому, что Pygame не может нарисовать их выше края экрана. На самом деле 
снаряды продолжают существовать; их координата 
y
продолжает уменьшаться. 
И это создает проблему, потому что снаряды продолжают потреблять память и вы-
числительные мощности.
От старых снарядов необходимо избавиться, иначе игра замедлится из-за большого 
объема лишней работы. Для этого необходимо определить момент, когда атрибут 
bottom
прямоугольника снаряда достигнет 0 — это означает, что снаряд вышел за 
верхний край экрана:


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


Достарыңызбен бөлісу:
1   ...   188   189   190   191   192   193   194   195   ...   334




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет