Найти в Дзене

Пишем игру Flappy Bird на Python. Определяем столкновения. Часть 6.

Оглавление
Зачем закрыли полетную зону?
Зачем закрыли полетную зону?

На прошлом занятии мы добавили препятствие в игру и в качестве самостоятельной работы необходимо было добавить второе препятствие самостоятельно. Сейчас мы разберемся как это сделать.

Добавим недостающее препятствие

Сначала определим место для добавления новых свойств нижнего препятствия. Это будет созданный ранее class Pipe и его магический метод __init__. *Почему данный метод называется магическим вы можете узнать на наших курсах в школе программирования для детей КИДКОД. С промо кодом "дзен" вы получите 25% скидку на первый месяц обучения.

Свойства верхнего препятствия в игре
Свойства верхнего препятствия в игре

Теперь добавим свойства для нижнего препятствия. Обратите внимание, что мы не будем использовать специальный метод переворота изображения так как оно уже находится в нужной нам позиции.

  • self.image_bottom - Определяем изображение и уменьшаем его до нужных нам размеров с помощью вызова метода smoothscale.
  • self.rect_bottom ... get_rect() - Определяем объект четырехугольника используя импортированное ранее изображение препятствия.
  • self.rect_bottom.bottom - Размещаем этот объект внизу графического окна нашей игры.
  • self.rect_bottom.right - Прячем препятствие за пределами графического окна.
Свойства для нижнего препятствия
Свойства для нижнего препятствия

Добавляем отрисовку нового препятствия в метод draw класса Pipe.

Метод для отрисовки препятствий
Метод для отрисовки препятствий

Также добавляем новое препятствие в метод update для его перемещения по экрану.

Метод обновления данных для препятствий
Метод обновления данных для препятствий

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

Перезагружаем препятствия
Перезагружаем препятствия

Теперь если вы сделали все правильно, то должны будете увидеть два перемещающихся в пространстве препятствия.

Текущий результат отображает два препятствия на экране
Текущий результат отображает два препятствия на экране

Первый способ определить столкновения

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

Вызываем новый метод bird.check_collision(pipe)
Вызываем новый метод bird.check_collision(pipe)

Переходим в класс Bird и создаем первый способ определить столкновение с препятствием. Для этого нам потребуется проверить 4 различных свойства позиционирования объектов в пространстве.

Схематичное отображение координат
Схематичное отображение координат
  • pipe.rect_top.left <= self.rect.right - Столкновение по оси-х для верхнего препятствия.
  • pipe.rect_top.bottom >= self.rect.top - Столкновение по оси-у для верхнего препятствия.
  • pipe.rect_bottom.left <= self.rect.right - Столкновение по оси-х для нижнего препятствия.
  • pipe.rect_bottom.top <= self.rect.bottom - Столкновение по оси-у для нижнего препятствия.
Проверка столкновений
Проверка столкновений

Теперь мы можем проверить результат и если птичка столкнется с одним из препятствий вы увидите в стандартном средстве вывода python указанный выше текст.

Теперь мы можем определить столкновение
Теперь мы можем определить столкновение
Текущий результат столкновений
Текущий результат столкновений

Второй способ определить столкновения

В модуле pygame у объектов rect есть специальный метод проверки столкновений - colliderect. Вы можете использовать его вместо ранее созданного условия проверки.

pygame уже все предусмотрел...
pygame уже все предусмотрел...

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

Напоминаем, что у нас есть бесплатные пробные занятия где вы сможете попробовать создать свои первые осмысленные программы вместе с преподавателем, который расскажет вам все в подробных деталях. Переходите на сайт школы программирования для детей КИДКОД и записывайтесь. Ждем вас на наших уроках!

Продолжение на следующем уроке