Книга «Изучаем Python»



Pdf көрінісі
бет165/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   161   162   163   164   165   166   167   168   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 13 • Осторожно, пришельцы!
fleet_direction
меняется на противоположное, для чего текущее значение умно-
жается на –1.
Мы изменили функцию 
update_aliens()
и включили в нее проверку нахождения 
пришельцев у края вызовом 
check_fleet_edges()

. Функция должна получать 
параметр 
ai_settings
, поэтому аргумент 
ai_settings
включается в вызов 
update_
aliens()
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(ai_settings, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Если запустить игру сейчас, флот будет двигаться влево-вправо между краями 
экрана и опускаться каждый раз, когда он доберется до края. Теперь можно пере-
ходить к реализации уничтожения и отслеживания пришельцев, сталкивающихся 
с кораблем или достигающих нижнего края экрана.
УПРАЖНЕНИЯ
13-3 . Капли: найдите изображение дождевой капли и создайте сетку из капель . Капли 
должны постепенно опускаться вниз и исчезать у нижнего края экрана .
13-4 . Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель 
у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение .
Уничтожение пришельцев
Итак, мы создали корабль и флот пришельцев — но, когда пули достигают пришель-
цев, они просто проходят насквозь, потому что программа не проверяет коллизии. 
В игровом программировании 
коллизией
называется перекрытие игровых элемен-
тов. Чтобы пули сбивали пришельцев, метод 
sprite.groupcollide()
используется 
для выявления коллизий между элементами двух групп.
Выявление коллизий
Когда пуля попадает в пришельца, программа должна немедленно узнать об этом, 
чтобы сбитый пришелец исчез с экрана. Для этого мы будем проверять коллизии 
сразу же после обновления позиции пули.
Метод 
sprite.groupcollide()
сравнивает прямоугольник 
rect
каждой пули с пря-
моугольником 
rect
каждого пришельца и возвращает словарь с пулями и при-
шельцами, между которыми обнаружены коллизии. Каждый ключ в словаре 
представляет пулю, а ассоциированное с ним значение — пришельца, в которого 
попала пуля. (Этот словарь будет использоваться в реализации системы подсчета 
очков счета в главе 14.)


Уничтожение пришельцев
271
Для проверки коллизий в функции 
update_bullets()
используется следующий код:
game_functions.py
def update_bullets(aliens, bullets):
"""Обновляет позиции пуль и удаляет старые пули."""
...
# Проверка попаданий в пришельцев.
# При обнаружении попадания удалить пулю и пришельца.
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
Новая строка сначала перебирает все пули в группе 
bullets
, а затем перебирает 
всех пришельцев в группе 
aliens
. Каждый раз, когда между прямоугольником 
пули и пришельца обнаруживается перекрытие, 
groupcollide()
добавляет пару 
«ключ—значение» в возвращаемый словарь. Два аргумента 
True
сообщают Pygame, 
нужно ли удалять столкнувшиеся объекты: пулю и пришельца. (Чтобы создать 
сверхмощную пулю, которая будет уничтожать всех пришельцев на своем пути, 
можно передать в первом аргументе 
False
, а во втором 
True
. Пришельцы, в которых 
попадает пуля, будут исчезать, но все пули будут оставаться активными до верхнего 
края экрана.)
При вызове 
update_bullets()
передается аргумент 
aliens
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
gf.update_bullets(aliens, bullets)
gf.update_aliens(ai_settings, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)


Достарыңызбен бөлісу:
1   ...   161   162   163   164   165   166   167   168   ...   266




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

    Басты бет