Текущее состояние игры и цели урока
На текущем этапе армия пришельцев движется к пушке, пушка может стрелять, но отсутствует взаимодействие между пулями и пришельцами, а также между пришельцами и пушкой. Цель урока – реализовать обработку коллизий: уничтожение пришельцев пулями и уничтожение пушки пришельцами.
Обработка коллизий пули-пришелец
Для обнаружения коллизий между пулями и пришельцами используется метод 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)
В этом уроке реализована обработка коллизий, добавлен учёт игровой статистики, улучшен игровой процесс добавлением бесконечной армии и проверкой достижения пришельцами нижней границы экрана. В последующих уроках планируется добавить подсчёт очков и завершить проект.