Как сделать так чтобы объект двигался за игроком

Обновлено: 08.07.2024

Привет! Наверняка прошлый урок вызвал головную боль, если вы его полностью прочли, так как он громоздкий и сложный для усвоения новичками. Если что-то непонятно - это ничего страшного. Аппетит приходит во время еды.
Сегодня мы рассмотрим важный аспект при разработке игры - движение объектов.

О, наконец-то практика! Но сначала все-таки узнаем, что движение тела, не что иное, как изменение его координат. Разумеется, в 2D играх, а значит и в GM, используется Декартова прямоугольная система координат. К сожалению (или к счастью), в GM ось ординат Y направлена вниз, а не вверх (ось абсцисс, как принято, направлена вправо). Вот картинка:

Изменяем х и у - двигаем объект! Элементарно, Ватсон! Достаточно в step событии объекта разместить код:

Важно: x и y - так называемые свойства объекта, являются встроенными разработчиками переменными, значения которых можно менять, и которые влияют на характеристики объекта и его поведение. Помимо всего, у объектов очень много свойств, к примеру, sprite_index или depth. Это также означает, что вы не сможете создать переменную с именем свойства. Но сейчас важны только свойства, относящиеся к движению. Примечание Uber

И, о да! Результат налицо, наш подопытный кролик потопал направо. Также можно и изменять координату у. Ради эксперимента, поиграйте со значениями.
А если движение на протяжении всей игры почти не изменятся? Как, например, движение платформы в платформере (влево-вправо, вверх-вниз). Для этого у каждого объекта есть свойства hspeed (от англ. horizontal speed), vspeed (vertical speed) и направление движения - direction (измеряется в градусах, от 0 до 360). В GM направления опять же немного отличаются от привычных, а именно:

  1. Создать объект, поместить его в комнату.
  2. В событии create объекта сначала попробовать изменять координаты (х-=2, у+=1, например). Какой можно сделать вывод?
  3. Теперь вместо изменения координат задайте hspeed и/или vspeed (например, hspeed=3) Понаблюдайте за эффектом.
  4. Ну и почти последний шаг: задайте переменную speed (скорость, она является результатом сложения hspeed и vspeed) и direction, заодно.
  5. Порадуйтесь своему успеху!

Кроме x и y, у нас есть ещё свойства, относящиеся к передвижению. Вот их список:
xprevious Отражает координату экземпляра объекта по оси X в предыдущем шаге.
yprevious Отражает координату экземпляра объекта по оси Y в предыдущем шаге.
xstart Отражает координату по оси X в текущей комнате при старте.
ystart Отражает координату по оси Y в текущей комнате при старте.
friction Отражает текущее трение экземпляра объекта (пикселей за шаг).
Трение просто постоянно замедляет объект, пока его скорость speed не упадёт до нуля. Примечание Uber
gravity Отражает силу гравитации для текущего экземпляра объекта (пикселей за шаг).
Стоит отметить, что это не скорость, с которой полетит объект в заданном gravity_direction направлении, а ускорение, которое получает объект и измеряется в пикселях за шаг в шаге (или шаг в квадрате). Примечание Uber
gravity_direction Отражает направление гравитации в градусах для текущего экземпляра объекта (270 - вниз).

Поэтапное описание реализации эффекта с примером кода.

Пользователь Reddit под ником Awsomelity опубликовал короткий туториал для Unity, в котором показал, как сделать камеру, плавно следующую за объектом. Автор представил код, а также подробно показал все этапа реализации этого эффекта.

На сцене вам понадобится лишь несколько объектов: направленный свет, плоскость, предмет и камера. Сперва нужно создать скрипт.

Затем прикрепите скрипт к камере и откройте его. В этом окне удалите ненужную часть кода.

< [SerializeField] private GameObject _object; //An object camera will follow [SerializeField] private Vector3 _distanceFromObject; // Camera's distance from the object

Новая часть кода:

< Vector3 positionToGo = _object.transform.position + _distanceFromObject; //Target position of the camera Vector3 smoothPosition = Vector3.Lerp(a:transform.position, b:positionToGo, t:0.125F); Smooth position of the camera transform.position = smoothPosition;

На этом этапе эффект плавной камеры выглядит вот так:

Но это пока не финальная версия эффекта. Теперь нужно сделать так, чтобы камера поворачивалась за объектом. Для этого достаточно всего одной строчки кода:

Вот так выглядит финальная версия эффекта:

Даже по последней гифке видно, что камера нифига не плавно поворачивает.

Автору стоит почитать и понять то как работает lerp, в его варианте каждый вызов ф-ии LateUpdate будет перемещать камеру на 12.5% от требуемого смещения. И чем дальше и быстрее обьект будет удаляться от камеры тем более вырвиглазно это будет выглядеть.

К тому же, константное значение dt в лерпе делает его fps-независимым => на разных fps, результат будет выглядеть по разному.

Движение объекта в Pygame

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

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

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

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

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

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

  • по горизонтали вдоль оси Х
  • по вертикали вдоль оси 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).

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

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

Для наших примеров мы будем использовать KinematicBody2D , но эти принципы так же применимы и для других типов узлов (Area2D, RigidBody2D).

Настройка¶

Каждый из примеров показанных ниже использует одинаковые настройки сцены. Начинайте с добавления KinematicBody2D с двумя дочерними узлами: Sprite и CollisionShape2D . Вы можете использовать иконку Godot ("icon.jpg") в качестве текстуры спрайта или воспользоваться любой другой 2D картинкой которая имеется.

Откройте Проект -> Настройки проекта и выберите вкладку "Список действий". Добавьте следующие действия (для справки InputEvent ):

../../_images/movement_inputs.jpg

В этом примере мы хотим, чтобы игрок использовал четыре клавиши для выбора движения в заданном направлении (клавиши - стрелки: вверх/влево/вниз/вправо или W/A/S/D). Термин 8 - позиционное перемещение исходит из факта, что игрок может перемещаться по диагонали удерживая одновременно две клавиши.

Читайте также: