Phaser предоставляет мощную интеграцию с физическим движком Matter.js, позволяя создавать сложные физические взаимодействия объектов в 2D-пространстве. Matter.js представляет собой гибкий движок с поддержкой твердых тел, столкновений, сил и constraints (ограничений).
Для использования Matter.js необходимо указать его как физический движок при создании конфигурации игры:
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
physics: {
default: 'matter',
matter: {
gravity: { y: 1 }, // стандартная гравитация по оси Y
debug: true, // включение режима отладки
}
},
scene: {
preload: preload,
create: create,
update: update
}
};
const game = new Phaser.Game(config);
Ключевые моменты инициализации:
default: 'matter' — указывает, что по умолчанию
используется Matter.js.gravity — задает глобальную гравитацию сцены; можно
отдельно настраивать по оси X и Y.debug — отображает физические тела, что удобно при
тестировании.В Matter.js объекты называются бодисами (bodies).
Phaser упрощает работу с ними через методы
this.matter.add.
Прямоугольник:
let box = this.matter.add.rectangle(400, 300, 80, 80, {
restitution: 0.8, // коэффициент упругости
friction: 0.1, // трение при движении
density: 0.001 // плотность объекта
});
Круг:
let ball = this.matter.add.circle(200, 100, 40, {
restitution: 0.9,
friction: 0.05
});
Полигон:
let polygon = this.matter.add.polygon(600, 300, 5, 50, {
restitution: 0.6,
friction: 0.2
});
Особенности:
restitution отвечает за отскок тела при
столкновении.friction — сопротивление движению при контакте с
другими телами.density влияет на массу тела и его реакцию на
силы.Phaser позволяет автоматически привязывать визуальные объекты к телам Matter.js:
let sprite = this.matter.add.sprite(400, 200, 'boxTexture');
sprite.setRectangle(80, 80);
sprite.setBounce(0.7); // аналог restitution
sprite.setFriction(0.05);
Методы для настройки тела спрайта:
setCircle(radius) — задает форму круга.setPolygon(sides, radius) — задает форму
многоугольника.setStatic(true) — делает тело неподвижным.setFixedRotation() — запрещает вращение тела.Matter.js поддерживает constraints — соединения между объектами:
let ballA = this.matter.add.circle(300, 100, 20);
let ballB = this.matter.add.circle(350, 100, 20);
this.matter.add.constraint(ballA, ballB, 50, 0.9); // длина 50, жесткость 0.9
Параметры constraints:
length — естественная длина соединения.stiffness — жесткость, от 0 (гибкое) до 1
(жесткое).damping — гашение колебаний, снижает «качание»
тел.Для контроля коллизий используется система collision categories и masks:
const CATEGORY_PLAYER = 0x0001;
const CATEGORY_ENEMY = 0x0002;
let player = this.matter.add.rectangle(100, 100, 50, 50, {
collisionFilter: { category: CATEGORY_PLAYER, mask: CATEGORY_ENEMY }
});
let enemy = this.matter.add.rectangle(300, 100, 50, 50, {
collisionFilter: { category: CATEGORY_ENEMY, mask: CATEGORY_PLAYER }
});
События столкновений:
this.matter.world.on('collisionstart', function(event) {
event.pairs.forEach(pair => {
console.log('Столкновение:', pair.bodyA, pair.bodyB);
});
});
Доступные события:
collisionstart — начало контакта тел.collisionactive — контакт продолжается.collisionend — контакт завершен.Matter.js поддерживает динамическое воздействие на тела:
let ball = this.matter.add.circle(400, 200, 30);
ball.applyForce({ x: 0.01, y: -0.02 }); // добавление силы
ball.setVelocity(2, 3); // установка скорости напрямую
ball.setAngularVelocity(0.1); // вращение тела
applyForce добавляет силу пропорционально массе
тела.setVelocity мгновенно изменяет скорость тела.setAngularVelocity контролирует вращение.Phaser позволяет настраивать мир физики:
this.matter.world.setBounds(0, 0, 800, 600, 32, true, true, true, true);
this.matter.world.setGravity(0, 1); // по умолчанию вниз
this.matter.world.disableGravity(); // отключение гравитации для всех объектов
Основные возможности:
setBounds — установка границ мира с возможностью
отскока от стен.setGravity — изменение гравитации по каждой оси.disableGravity — глобальное отключение гравитации.Matter.js позволяет создавать тела на основе сложных форм:
this.matter.add.sprite(400, 300, 'levelTile').setPolygonFromTilemap('layerName');
Для сложных многоугольников можно использовать метод
fromVertices:
let verts = [
{ x: 0, y: 0 },
{ x: 60, y: 20 },
{ x: 40, y: 80 }
];
let complexBody = this.matter.add.fromVertices(500, 200, verts, {
restitution: 0.5
});
debug.setStatic(true)).sleeping для тел, которые долго не
участвуют в симуляции:ball.setSleepThreshold(60); // через 60 фреймов без движения тело «засыпает»
Matter.js в Phaser открывает широкие возможности для создания реалистичной физики, динамических взаимодействий и сложных игровых механик. С правильной настройкой тел, constraints и событий можно моделировать как простые падения и отскоки, так и сложные механизмы с цепочками, рычагами и динамическими объектами.