Pygame движение объекта по окружности

Библиотека Pygame / Часть 2. Работа со спрайтами

Вторая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: «Библиотека Pygame / Часть 1. Введение».

Видео:Как Работать с Физикой на Python. Доска Гальтона [ Pygame + Pymunk ]Скачать

Как Работать с Физикой на Python. Доска Гальтона [ Pygame + Pymunk ]

Что такое спрайт?

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

Для загрузки и отрисовки спрайтов в случай этой игры их нужно добавить в разделы “Обновление” и “Визуализация” игрового цикла. Несложно представить, что если в игре много спрайтов, то цикл довольно быстро станет большим и запутанным. В Pygame для этого есть решение: группировка спрайтов.

Набор спрайтов — это коллекция спрайтов, которые могут отображаться одновременно. Вот как нужно создавать группу спрайтов в игре:

Теперь этой возможностью можно воспользоваться, добавив группу целиком в цикл:

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

Видео:АЛГОРИТМ ДВИЖЕНИЯ ПО ОКРУЖНОСТИСкачать

АЛГОРИТМ ДВИЖЕНИЯ ПО ОКРУЖНОСТИ

Создание спрайта

Можно переходить к созданию первого спрайта. В Pygame все спрайты выступают объектами. Если вы не работали с этим типом данных в Python, то для начала достаточно знать, что это удобный способ группировки данных и кода в единую сущность. Поначалу это может путать, но спрайты Pygame — отличная возможность попрактиковаться в работе с объектами и понять, как они работают.

Начнем с определения нового спрайта:

class сообщает Python, что определяется новый объект, который будет спрайтом игрока. Его тип pygame.sprite.Sprite . Это значит, что он будет основан на заранее определенном в Pygame классе Sprite .

Первое, что нужно в определении class — специальная функция __init__() , включающая код, который будет запущен при создании нового объекта этого типа. Также у каждого спрайта в Pygame должно быть два свойства: image и rect .

Первая строка, Pygame.sprite.Sprite.__init__(self) требуется в Pygame — она запускает инициализатор встроенных классов Sprite . Далее необходимо определить свойство image . Сейчас просто создадим квадрат размером 50х50 и заполним его зеленым ( GREEN ) цветом. Чуть позже вы узнаете, как сделать image спрайта красивее, используя, например, персонажа или космический корабль, но сейчас достаточно сплошного квадрата.

Дальше необходимо определить rect спрайта. Это сокращенное от rectangle (прямоугольник). Прямоугольники повсеместно используются в Pygame для отслеживания координат объектов. Команда get_rect() оценивает изображение image и высчитывает прямоугольник, способный окружить его.

rect можно использовать для размещения спрайта в любом месте. Начнем с создания спрайта по центру:

Теперь, после определения спрайта игрока Player, нужно отрисовать (создать) его, инициализировав экземпляр (instance) класса Player. Также нужно обязательно добавить спрайт в группу all_sprites .

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

Pygame движение объекта по окружности

Видео:Игра на PYGAME с нуля. Урок 2 - Объекты и движениеСкачать

Игра на PYGAME с нуля. Урок 2 - Объекты и движение

Движение спрайта

В игровом цикле есть функция all_sprites.update() . Это значит, что для каждого спрайта в группе Pygame ищет функцию update() и запускает ее. Чтобы спрайт двигался, нужно определить его правила обновления:

Это значит, что при каждом игровом цикле x-координата спрайта будет увеличиваться на 5 пикселей. Запустите программу, чтобы посмотреть, как он скрывается за пределами экрана, достигая правой стороны.

Pygame движение объекта по окружности

Исправить это можно, заставив спрайт двигаться по кругу — когда он добирается до правой стороны экрана, просто переносить его влево. Это легко сделать, используя элемент управления rect спрайта:

Pygame движение объекта по окружности

Так, если левая сторона rect пропадает с экрана, просто задаем значение правого края равное 0:

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

Pygame движение объекта по окружности

На этом все. Отправляйтесь изучать и экспериментировать, но не забывайте, что все, что вы помещаете в метод update() , будет происходить в каждом кадре. Попробуйте научить спрайт двигаться сверху вниз (изменив координату y ) или заставить его отталкиваться от стен (изменяя направлении по достижении края).

Видео:Игра на Pygame с нуля / Урок #4 – Анимации и звукСкачать

Игра на Pygame с нуля / Урок #4 – Анимации и звук

Код урока:

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

Видео:Как работать с изображениями. Модули image и transform | Pygame #8Скачать

Как работать с изображениями. Модули image и transform | Pygame #8

Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали

Видео:Что такое спрайты и как с ними работать | Pygame #9Скачать

Что такое спрайты и как с ними работать | Pygame #9

Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали

Как показывает практика, движение — это жизнь! Поэтому сегодня мы вдохнем жизнь в сотворенный посредством Pygame объект и научим его двигаться без учета сигналов с клавиатуры! Для начала мы рассмотрим движение объекта в Pygame по прямой вдоль оси X, затем развернем объект и зададим ему движение вдоль оси Y, и в заключение — оформим диагональное перемещение объекта. Однако сначала предлагаю взглянуть на исходный код.

Исходные данные

Давайте взглянем на исходный код: у нас имеется экран csreen шириной 500px и высотой 300px, а также изображение мыши «mouse.png», расположенное на экране по заданным координатам: mouseX = 0, mouseY = 200:

При запуске кода мы увидим в левом нижнем углу экрана притаившуюся мышку с повернутой вправо мордочкой:

Что будем делать?

Необходимо научить мышку двигаться непрерывно:

  • по горизонтали вдоль оси Х
  • по вертикали вдоль оси Y
  • по диагонали из левого нижнего угла в правый верхний угол

Общий принцип непрерывного движения в Pygame на примере движения вдоль оси X

В настоящий момент для вывода изображения мышки на экран мы используем цикл while (while True: ..) . То есть пока открыто игровое поле, мы осуществляем вывод изображения на экран в цикле по заданным координатам через каждые 30 мс (что определено строкой pygame.time.delay(30)).

В одной секунде содержится 1000 миллисекунд

Так как под движением в Pygame подразумевается перемещение объекта на заданную позицию через определенный промежуток времени, то для смещения мыши на 5px каждые 30 мс, нужно в цикле while увеличивать значение координаты X на 5px. Для этого добавим в исходный код всего 2 строчки: строку с определением переменной скорости speed, в которой будем хранить заданное смещение 5px расположим перед циклом while; а строку, задающее смещение изображение: mouseX += speed расположим в теле цикла while. В итоге получим зеленую поляну с мышкой, бегущей по горизонтальной прямой:

Код непрерывного движения объекта в Pygame по горизонтали:

Непрерывное движение объекта в Pygame вдоль оси Y

Для наглядности, сдвинем начальную позицию мышки ближе к центру, переопределив переменные стартовой позиции, как mouseX=200 и mouseY=200.

В соответствии с описанным выше принципом, зададим объекту движение по горизонтали, только изменять будем координату mouseY. В связи с тем, что точка с нулевыми координатами в Pygame располагается в верхнем левом углу поля, то при движении объекта вверх, значение координаты Y будет уменьшаться на заданное в переменной speed значение: Y -= speed. Однако, прежде чем мы добавим эту строчку в цикл while, предлагаю развернуть нашу мышку мордочкой вправо(т.е. на 90 градусов) с помощью функции pygame.transform.rotate(mouse, 90):

Код непрерывного движения объекта в Pygame по вертикали

Полученный результат:

Непрерывное движение объекта по диагонали в Pygame

При движении объекта по диагонали происходит одновременное смещение как по оси X, так и по оси Y, поэтому добавим в цикл while строки с изменением значений этих координат. Так как мы планируем движение мыши из левого нижнего угла в правый верхний угол прямоугольного экрана, то:

1. Сначала повернем мышь так, чтобы ее мордочка смотрела по направлению движения. Для этого используем функцию pygame.transform.rotate(mouse, 30).

2. Затем подкорректируем стартовую позицию объекта, чтобы повернутое изображение «выезжало» точно из левого нижнего угла: moveX=-13, moveY=218.

3. После этого, в цикле while зададим смещение по оси Х на величину speed: mouseX += speed. Кроме того, определим смещение по оси Y: так как размер игровой сцены 500×300, то при движении к правому верхнему углу поля, смещение мыши по оси Y должно быть меньше горизонтального смещения примерно в 300/500 или в 3/5 раз. Таким образом, определим смещение по Y, как: mouseY -= 3/5*speed.

Посмотрим, как будет выглядеть код после внесенных в него изменений:

Код непрерывного движения объекта в Pygame по диагонали

А теперь посмотрим на получившийся результат:

Видео:Физика - движение по окружностиСкачать

Физика - движение по окружности

Вращение 2D объекта по окружности

Привет, если ты читаешь эту статью, значит ты хочешь узнать ответ на вопрос «как работает вращение объекта в 2D ?»

Ты скорее всего знаешь что во всех современных движках, таких как Unity вращение осуществляется с помощью функции, но нам интересно, как можно написать алгоритм
вращения своими руками.

Если проще то наш алгоритм работает так.

Мы представляем окружность, где:

  1. Центр это точка, вокруг которой мы вращаем объект.
  2. Радиус — расстояние от центра до вращаемого объекта.

Итак, начнем.

Давайте взглянем на рисунок ниже:

Pygame движение объекта по окружности

Дано: длинна радиуса, координаты точки вращения, угол АОВ, АВ перпендикулярен оси ОХ.
Задача: Задать вращение точки А на 360 градусов с помощью формулы.
Рассмотрим: треугольник ОАВ:
угол ОВА — прямой => треугольник ОАВ — прямоугольный треугольник;
тогда:
гипотенуза = радиусу окружности с центром в точке О
угол поворота = от 1 до 360 градусов
тогда чтобы найти катеты ОВ и АВ нужно:
АВ = радиус * cos(угла поворота),
ОВ = $inline$радиус * sin(угла поворота)$inline$
Теперь когда мы знаем размеры катетов
мы составим формулу:
для координаты по x:$inline$позиция по x = радиус * cos(угла поворота) + начальная позиция по x$inline$,
и для координаты по y: $inline$позиция по y = радиус * sin(угла поворота) + начальная позиция по y$inline$

Давайте попробуем применить формулы:

Не сложно догадаться что делает этот код, а именно вращает наш кружок по оси, но почему лишь один раз?

Давайте вспомним уроки геометрии в седьмом классе: градусная мера угла не может превышает 360 градусов.

А если попробуем обнулять угол вращения, когда тот будет больше 360 градусов, давайте посмотрим что из этого выйдет:

Этот код позволяет вращать кружок по оси бесконечно.

Однако у этой формулы есть один недостаток: можно вращать объекты только на 1 оборот. Это значит что нам нужна другая формула.

Давайте улучшим нашу формулу: Pygame движение объекта по окружности

Дано:
треугольник ОАВ — прямоугольный
катет 1 = x1 — начальная координата X
катет 2 = y1 — начальная координата y

Задача:
улучшить формулу так, что-бы можно было вращать точку А на неизвестный угол.

Решение:
Из предыдущей задачи мы знаем что:
$inline$$inline$xPos = (lineLong * cos(a)) + StartPosX$inline$$inline$. => $inline$cos(a) = xPos — startPosX: (lineLong )$inline$

И теперь мы можем вывести формулу по нахождению угла a
$inline$yPos = (lineLong * sin(a)) + StartPosY$inline$ => $$display$$a = arccos((xPos — startPosX): lineLong)$$display$$.

А сейчас обновим нашу формулу и получим: $$display$$xPos = (lineLong * cos(a +b)) + startPosX$$display$$

Теперь у нас есть формула которая позволяет бесконечно вращать точку по окружности: $$display$$xPos = (lineLong * cos(a +arccos((xPos — startPosX): lineLong))) + startPosX$$display$$

Давайте напишем код, который будет вращать наш объект по нажатию на клавишу.

Примерно таком образом решается эта задача.

Надеюсь, ты смог извлечь полезную информацию из моего поста, желаю удачно применить полученные знания на практике

💡 Видео

Графика в Python. Анимация. Передвижение объектов.Скачать

Графика в Python. Анимация. Передвижение объектов.

Создание персонажа: привязка к клавиатуры и добавление анимации на языке PythonСкачать

Создание персонажа: привязка к клавиатуры и добавление анимации на языке Python

#PYTHON# ДВИЖЕНИЕ КУБИКА НА PYGAMEСкачать

#PYTHON# ДВИЖЕНИЕ КУБИКА НА PYGAME

Как делать контроль столкновений | Pygame #10Скачать

Как делать контроль столкновений | Pygame #10

Передвижение заднего фона игры. Самый простой способ прокрутки камеры. (Python. Pygame)Скачать

Передвижение заднего фона игры. Самый простой способ прокрутки камеры. (Python. Pygame)

Разработка игр на Python 3 с PyGame / #2 - Движение игрокаСкачать

Разработка игр на Python 3 с PyGame / #2 - Движение игрока

Разработка игры на Python | Pygame. Урок #2Скачать

Разработка игры на Python | Pygame. Урок #2

Pygame - Обработка мышиСкачать

Pygame - Обработка мыши

Pygame - Display Image in Pygame python || Pygame python tutorial #python #pygameСкачать

Pygame - Display Image in Pygame python || Pygame python tutorial #python #pygame

Игра на Pygame с нуля / Урок #3 – Добавление объектов на экранСкачать

Игра на Pygame с нуля / Урок #3 – Добавление объектов на экран
Поделиться или сохранить к себе: