ArcadeBody: свойства velocity, acceleration, drag

Phaser предоставляет мощную систему 2D-физики через модуль Arcade Physics, который оптимизирован для создания динамичных, но при этом производительных игр. Центральными понятиями для управления движением объектов являются velocity, acceleration и drag. Эти свойства задают скорость, ускорение и сопротивление движения объектов в игровом мире.


Velocity (скорость)

velocity определяет мгновенную скорость объекта по осям X и Y. Значение может быть положительным или отрицательным:

player.body.velocity.x = 200; // движение вправо
player.body.velocity.y = -150; // движение вверх
  • velocity.x — горизонтальная скорость, положительные значения направлены вправо.
  • velocity.y — вертикальная скорость, положительные значения направлены вниз.
  • Изменение velocity напрямую влияет на позицию объекта каждый кадр: Phaser автоматически обновляет координаты объекта на основе его текущей скорости.

Особенности использования:

  • Можно задавать скорость сразу через объект:
player.body.setVelocity(100, 200);
  • Для ограничения максимальной скорости существует свойство maxVelocity:
player.body.maxVelocity.x = 300;
player.body.maxVelocity.y = 300;

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


Acceleration (ускорение)

acceleration задает изменение скорости объекта со временем. Это аналог физической силы, действующей на тело:

player.body.acceleration.x = 50;  // ускорение вправо
player.body.acceleration.y = 0;   // отсутствие ускорения по вертикали
  • Используется для плавного разгона объектов вместо мгновенного изменения velocity.
  • Поддерживает отдельное управление по осям x и y.
  • Комбинируется с maxVelocity, чтобы контролировать предельную скорость объекта:
player.body.setAcceleration(200, 0);
player.body.setMaxVelocity(400, 400);
  • Для мгновенной остановки ускорения можно использовать метод setAcceleration(0) или напрямую обнулить acceleration.x и acceleration.y.

Drag (сопротивление, трение)

drag моделирует силу сопротивления среды, которая замедляет объект. Это свойство особенно важно для имитации трения на поверхности или воздуха.

player.body.drag.x = 100;  // сопротивление по горизонтали
player.body.drag.y = 50;   // сопротивление по вертикали
  • drag.x и drag.y применяются независимо, что позволяет имитировать различные условия для каждой оси.
  • Сопротивление уменьшает скорость объекта постепенно, пока не достигнет нуля.
  • Используется вместе с acceleration и velocity для создания естественного движения:
player.body.setDrag(200, 100);
player.body.setAcceleration(300, 0);

В данном примере объект будет ускоряться по X, но скорость будет ограничена трением, создавая плавное движение и остановку.


Взаимодействие velocity, acceleration и drag

  1. Ускорение изменяет скорость — объект постепенно разгоняется.
  2. Сопротивление замедляет скорость — объект постепенно останавливается, если ускорение не применяется.
  3. Скорость задает мгновенное движение — напрямую управляет перемещением тела в мире.

Пример сочетания:

player.body.setAcceleration(400, 0);
player.body.setDrag(300, 0);
player.body.setMaxVelocity(500, 0);
  • Игрок разгоняется вправо (acceleration.x = 400).
  • Трение замедляет объект, создавая плавный разгон и остановку.
  • Максимальная скорость ограничена 500.

Практические советы

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

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