Глава 21 · Проект: космический шутер

Попадания и столкновения

colliderect() проверяет столкновения — попадание уничтожает врага, а враг может уничтожить корабль.

Уничтожаем врагов

Столкновение пули с врагом проверяет готовый метод Rect.colliderect() — при попадании оба удаляются из своих списков, а счёт увеличивается:

unichtozhenie_vragov.py
novye_puli = []
novye_vragi = list(vragi)
for pulya in puli:
    popala = False
    for vrag in list(novye_vragi):
        if pulya.colliderect(vrag):
            novye_vragi.remove(vrag)
            schet += 10
            popala = True
            break
    if not popala:
        novye_puli.append(pulya)
puli = novye_puli
vragi = novye_vragi
Почему не удалять элементы прямо во время перебора списка?
Удаление элемента из списка vragi прямо внутри цикла for vrag in vragi: может пропустить соседние элементы — список «сдвигается» под ногами цикла. Безопаснее собрать новые списки уцелевших пуль и врагов, как показано выше. Финальная версия (раздел 21.9) решает эту же задачу без ручных списков — через pygame.sprite.Group и groupcollide().
Реальное окно: оранжевая вспышка взрыва в точке, где пуля попала во врага, счёт увеличился до 100
Реальное окно — момент попадания: враг уничтожен, счёт увеличился ровно один раз.

Когда враг уничтожает корабль

Если враг долетел до низа экрана или столкнулся с кораблём — игра заканчивается:

unichtozhenie_korablya.py
for vrag in vragi:
    if vrag.bottom >= VYSOTA or vrag.colliderect(korabl):
        igra_okonchena = True
        break
Мгновенный конец игры — тоже временное решение
Здесь одно столкновение сразу заканчивает игру. Финальная версия (раздел 21.16) заменяет это на систему жизней с временной неуязвимостью после удара — так три врага, столкнувшихся с кораблём в один момент, не отнимают сразу три жизни.
Практика: столкновения пуль, врагов и корабля
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →