Выявление коллизий

We use cookies. Read the Privacy and Cookie Policy

Когда пуля попадает в пришельца, программа должна немедленно узнать об этом, чтобы сбитый пришелец исчез с экрана. Для этого мы будем проверять коллизии сразу же после обновления позиции пули.

Метод sprite.groupcollide() сравнивает прямоугольник rect каждой пули с прямоугольником rect каждого пришельца и возвращает словарь с пулями и пришельцами, между которыми обнаружены коллизии. Каждый ключ в словаре представляет пулю, а ассоциированное с ним значение — пришельца, в которого попала пуля. (Этот словарь будет использоваться в реализации системы подсчета очков счета в главе 14.)

Для проверки коллизий в функции 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)

Рис. 13.5. Пули уничтожают пришельцев!

Если запустить Alien Invasion сейчас, пришельцы, в которых попадает пуля, будут исчезать с экрана. На рис. 13.5 изображен частично уничтоженный флот.