Pygame: Коллизии в игре на Python (Урок 5)

Текущее состояние игры и цели урока

На текущем этапе армия пришельцев движется к пушке, пушка может стрелять, но отсутствует взаимодействие между пулями и пришельцами, а также между пришельцами и пушкой. Цель урока – реализовать обработку коллизий: уничтожение пришельцев пулями и уничтожение пушки пришельцами.

Обработка коллизий пули-пришелец

Для обнаружения коллизий между пулями и пришельцами используется метод pygame.sprite.groupcollide. Этот метод сравнивает прямоугольники (rect) каждой пули с прямоугольниками каждого пришельца. При пересечении прямоугольников (коллизия) создаётся словарь, где ключ – пуля, а значение – пришелец.

В функцию update_bullets добавляется группа пришельцев как параметр. Метод groupcollide применяется к группам пуль и пришельцев. Аргументы True, True указывают на удаление пули и пришельца после коллизии:

collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

После этого изменения пули будут уничтожать пришельцев.

Обработка коллизий пушка-пришелец

Для проверки коллизий между пришельцами и пушкой используется метод pygame.sprite.spritecollideany. Этот метод вызывается при обновлении позиции каждого пришельца. Если пришелец пересекается с пушкой, выводится сообщение в консоль:

if pygame.sprite.spritecollideany(gun, aliens):
    print("!!!")

Учёт игровой статистики и обработка столкновения

Для отслеживания статистики (количество жизней пушки) создаётся файл stats.py с классом Stats. В этом классе хранится атрибут guns_left, представляющий количество жизней.

Функция gun_kill обрабатывает столкновение пришельца с пушкой: уменьшает количество жизней (guns_left -= 1), очищает группы пуль и пришельцев (bullets.empty(), aliens.empty()), создаёт задержку с помощью time.sleep(2), создаёт новую армию пришельцев и отрисовывает пушку заново с помощью функции create_gun.

def gun_kill(stats, screen, gun, aliens, bullets):
    """Обработка столкновения пушки и армии."""
    stats.guns_left -= 1
    bullets.empty()
    aliens.empty()
    time.sleep(2)
    create_army(screen, aliens)
    create_gun(screen, gun)

Функция create_gun размещает пушку по центру нижней части экрана.

В функцию update_aliens добавляется вызов gun_kill при столкновении:

if pygame.sprite.spritecollideany(gun, aliens):
    gun_kill(stats, screen, gun, aliens, bullets)

Проблема с неточным определением границ пушки решается корректировкой изображения пушки в графическом редакторе (например, Photoshop) для удаления лишнего пустого пространства.

Улучшение скорости пуль и проверка достижения пришельцами нижней границы экрана

Скорость пуль изменяется корректировкой скорости в файле bullets.py.

Добавлена функция check_aliens_bottom:

def check_aliens_bottom(stats, screen, gun, aliens, bullets):
    """Проверка достижения армией нижней границы экрана."""
    screen_rect = screen.get_rect()
    for alien in aliens.sprites():
        if alien.rect.bottom > screen_rect.bottom:
            gun_kill(stats, screen, gun, aliens, bullets)
            break

В функцию update_aliens добавляется вызов check_aliens_bottom.

Реализация бесконечной армии пришельцев

Для реализации бесконечной армии пришельцев, в функции update_bullets проверяется, пуста ли группа пришельцев:

if len(aliens) == 0:
    bullets.empty()
    create_army(screen, aliens)

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

Что будем искать? Например,программа