Сегодня нас ждет добавление нового функционала перемещения предметов по горизонтали. Также мы создадим иллюзию движения самой птички.
Добавляем класс определяющий статичные препятствия
Создаем базовый класс Pipe (переводится как труба). Он будет отвечать за сохранение и изменение свойств препятствий. Для этого в любом месте перед основным циклом игры добавьте следующие операции:
- self.width - Ширина препятствия
- self.height - Высота препятствия
- self.image_top .smoothscale - Данный метод "впишет" указанное первым аргументом изображение в размерные рамки, указанные в виде кортежа вторым аргументом. Это необходимо сделать для того, чтобы уменьшить или увеличить изображение в игре
- self.rect_top - Определение объекта препятствия
- self.rect_top.top - Размещаем препятствие по оси у. Нулевое значение означает размещение в верхней части графического окна
- self.rect_top.right - Размещение препятствия по оси х
Далее нам потребуется специальный метод класса для отрисовки этого объекта. Этот метод необходимо добавить в class Pipe.
Создаем новый объект класса Pipe. К нему мы будем обращаться для вызова методов внутри основного цикла игры.
Последней операцией для добавления статичного препятствия будет вызов метода отрисовки в основном цикле игры.
Если мы сейчас проверим результат то увидим, как изображения размещенного препятствия выглядит довольно странно. Это потому что картинка размещается в том виде в котором она сохранена на компьютере. Для ее переворота мы можем:
- Развернуть само изображение с помощью графических редакторов
- Вызвать специальный метод модуля pygame
Мы используем метод поворота изображения - rotate. В качестве первого аргумента он принимает ссылку на само изображение, а второй аргумент отвечает за поворот в градусах.
Осталось проверить результат и убедиться в наличии статичной развернутой картинки созданного препятствия в нашей игре.
Перемещение препятствия
Для дальнейших действий нам потребуется спрятать препятствие и добавить скорость его перемещения по полю. Данные свойства мы добавляем в магический метод __init__ класса Pipe. *Почему данный метод называется магическим вы сможете узнать на наших курсах начинающего python разработчика в школе программирования для детей КИДКОД.
- self.rect_top.right - Изменяем старое значение 300 на новое. SCREEN_WIDTH (ширина экрана) + self.width (ширина препятствия)
- self.speed - Отрицательная скорость позволит переместить объект влево по оси х
Теперь нам необходимо добавить метод обновления данных для созданного объекта. Этот метод будет изменять положение препятствие по оси х.
- self.rect_top.move_ip(x, y) - Двигаем препятствие влево каждый кадр отрисовки игры.
Вызываем созданный метод в основном цикле нашей игры.
Если мы сделали все правильно, то должны будем увидеть изменения положения препятствия в пространстве по оси х.
Возвращаем препятствие на место
Сейчас наше препятствие "уезжает" за пределы экрана и больше не возвращается. Для того, чтобы оно заново появилось на экране, нам потребуется сначала проверить положение препятствия, а затем переместить его обратно за экран:
- self.rect_top.right < 0 - Если положение в пространстве правой части препятствия вышло за пределы экрана по оси х
- self.rect_top.right = SCREEN_WIDTH + self.width - Ставим препятствие обратно за экран
Добавляем для определения размера случайный параметр
Сначала добавим новый модуль для определения случайных чисел.
- from random import randint - Модуль определения случайных целых чисел
Далее добавим новый метод в класс Pipe для определения случайного числа от 100 до 250. Это число будет применяться для генерации нового значения высоты препятствия.
В метод обновления данных мы добавим два указателя в метод вызова обновлений для объекта Pipe:
- self.image_top = ... - Меняем свойство определяющее высоту на вызов ранее созданного метода
- self.rect_top = self.image_top.get_rect() - Так как мы поменяли свойство высоты, то теперь необходимо "обновить" сам объект препятствия. Чтобы новые значения учитывались при его определении (это поможет нам в проверке столкновений).
В качестве результата вы должны будете увидеть изменения размера препятствия каждый раз когда оно будет заново появляться на экране.
В качестве самостоятельной работы, попробуйте добавить препятствие, которое появится снизу. На следующем уроке мы разберем обязательно разберем эту тему.