Библиотека Phaser 3 предоставляет мощный модуль физики Matter.js, который поддерживает сложные взаимодействия между объектами с помощью суставов (constraints) и ограничителей. Суставы позволяют соединять тела, имитируя пружины, тросы, рычажные механизмы и другие динамические связи.
В Phaser через Matter.js реализованы несколько видов суставов:
Distance Constraint (Расстояние) Поддерживает фиксированное или ограниченное расстояние между двумя телами. Используется для имитации тросов, цепей и соединительных стержней.
this.matter.add.constraint(bodyA, bodyB, 100, 0.5);
Параметры:
bodyA, bodyB — соединяемые тела
(обязательные).length — длина связи (по умолчанию текущее расстояние
между телами).stiffness — жёсткость пружины, от 0 (мягко) до 1
(жёстко).Spring Constraint (Пружина) Позволяет создавать упругие соединения, где тела могут колебаться относительно друг друга. Отличается от обычного расстояния тем, что здесь учитывается упругость, демпфирование и натяжение.
let spring = this.matter.add.spring(bodyA, bodyB, 0.5, 0.02);
Параметры:
stiffness — коэффициент упругости.damping — коэффициент демпфирования (снижает
колебания).Mouse Constraint (Сустав мыши) Специальный сустав, который позволяет «цеплять» объекты курсором. Полезно для интерактивных игр и редакторов физики.
this.matter.add.mouseSpring({ stiffness: 0.2 });Ключевые свойства для тонкой настройки:
Пример создания цепи из нескольких тел с расстояниями:
let chain = [];
let prevBody = null;
for (let i = 0; i < 5; i++) {
let body = this.matter.add.rectangle(400, 100 + i * 50, 50, 20, { chamfer: 5 });
chain.push(body);
if (prevBody) {
this.matter.add.constraint(prevBody, body, 50, 0.9);
}
prevBody = body;
}
Суставы могут использоваться для ограничения движений тела:
Angle Constraint (Угловой ограничитель) Позволяет ограничить вращение тела относительно другого:
this.matter.add.constraint(bodyA, bodyB, 0, 0.7, {
angleA: 0,
angleB: Math.PI / 4
});Lock Constraint (Фиксация) Полностью фиксирует два тела друг относительно друга, превращая их в одно. Это удобно для создания сложных конструкций из нескольких частей.
this.matter.add.constraint(bodyA, bodyB, 0, 1);Для сложных механизмов суставы можно комбинировать:
Пример механизма с вращением:
let wheel = this.matter.add.circle(300, 400, 40, { inertia: Infinity });
let axle = this.matter.add.rectangle(300, 400, 10, 10, { isStatic: true });
this.matter.add.constraint(wheel, axle, 0, 1, {
pointA: { x: 0, y: 0 },
pointB: { x: 0, y: 0 },
angularStiffness: 1
});
Phaser поддерживает визуализацию суставов через рендеринг debug graphics:
this.matter.world.createDebugGraphic();
this.matter.world.drawDebug = true;
Это позволяет видеть линии соединений, точки крепления и поведение пружин в реальном времени, что облегчает настройку сложных механизмов.
Суставы и ограничители открывают возможности создания реалистичной физики в 2D: цепей, маятников, роботов, транспортных механизмов. Комбинирование разных типов суставов и грамотная настройка параметров stiffness, damping, length и angularStiffness позволяют добиться плавных и предсказуемых движений объектов в Phaser.