Phaser предоставляет мощный инструментарий для работы с физическими объектами и их объединением в сложные структуры. Составные тела (composite bodies) и группы частей (compound shapes) позволяют создавать динамичные объекты, состоящие из нескольких физических элементов, что расширяет возможности при разработке игр с физикой и анимацией.
Составное тело представляет собой объединение нескольких физических объектов (частей) в один единый объект, который ведет себя как единое целое в физическом мире. В Phaser это реализуется через физический движок Matter.js, интегрированный в библиотеку. Каждая часть может иметь свою форму, массу, плотность и другие параметры физики.
Пример создания простого составного тела:
const { Bodies, Body, World } = Phaser.Physics.Matter.Matter;
const circlePart = Bodies.circle(0, 0, 30, { density: 0.001 });
const rectanglePart = Bodies.rectangle(0, 50, 80, 20, { density: 0.002 });
const compoundBody = Body.create({
parts: [circlePart, rectanglePart],
friction: 0.05,
restitution: 0.9
});
this.matter.world.add(compoundBody);
Ключевые моменты:
Bodies.circle и Bodies.rectangle создают
отдельные физические части.Body.create объединяет их в одно составное тело.parts — массив объектов, каждая часть которого
добавляется в тело.friction и restitution задают
свойства всего тела в целом.Составные тела позволяют:
Перемещать тело как единое целое: Все части синхронно реагируют на внешние силы и столкновения.
Body.setVelocity(compoundBody, { x: 5, y: -2 });Вращать тело: Вращение применяется ко всему составному объекту.
Body.setAngularVelocity(compoundBody, 0.05);Добавлять или удалять части динамически: Можно изменять структуру тела во время игры.
const newPart = Bodies.polygon(0, -40, 5, 20);
Body.setParts(compoundBody, [...compoundBody.parts, newPart]);Группы частей (groups) используются для объединения объектов, которые
должны взаимодействовать друг с другом, но при этом оставаться
отдельными телами. В Phaser это реализуется через
Matter.World.nextGroup и опцию
collisionFilter.
const group = this.matter.world.nextGroup(true);
const part1 = Bodies.circle(100, 100, 20, { collisionFilter: { group: group } });
const part2 = Bodies.rectangle(140, 100, 60, 20, { collisionFilter: { group: group } });
World.add(this.matter.world, [part1, part2]);
Особенности:
Каждая часть составного тела имеет собственные параметры:
Пример использования разных свойств частей:
const partA = Bodies.circle(0, 0, 20, { mass: 2, friction: 0.1 });
const partB = Bodies.rectangle(0, 40, 50, 10, { restitution: 0.8 });
const complexBody = Body.create({
parts: [partA, partB],
friction: 0.05,
frictionAir: 0.01
});
Составные тела легко связывать с визуальными спрайтами Phaser:
const sprite = this.add.sprite(200, 300, 'robot');
this.matter.add.gameObject(sprite, compoundBody);
Использование составных тел и групп частей позволяет создавать более реалистичную физику, разнообразное взаимодействие объектов и гибкую анимацию, сохраняя удобство управления и синхронизации с игровым миром Phaser.