Составные тела и группы частей

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 задают свойства всего тела в целом.

Манипуляции с составными телами

Составные тела позволяют:

  1. Перемещать тело как единое целое: Все части синхронно реагируют на внешние силы и столкновения.

    Body.setVelocity(compoundBody, { x: 5, y: -2 });
  2. Вращать тело: Вращение применяется ко всему составному объекту.

    Body.setAngularVelocity(compoundBody, 0.05);
  3. Добавлять или удалять части динамически: Можно изменять структуру тела во время игры.

    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]);

Особенности:

  • Объекты одной группы не сталкиваются друг с другом, но реагируют на другие тела.
  • Можно создавать сложные сцены с множеством интерактивных элементов, не опасаясь нежелательных столкновений внутри группы.
  • Полезно для объединения частей врагов, транспорта или декоративных элементов.

Физические свойства частей

Каждая часть составного тела имеет собственные параметры:

  • mass — масса части, влияет на инерцию тела.
  • density — плотность, используется для расчета массы автоматически.
  • friction — коэффициент трения.
  • restitution — упругость при столкновениях.
  • collisionFilter — настройка групп и масок столкновений.

Пример использования разных свойств частей:

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

Составные тела легко связывать с визуальными спрайтами Phaser:

const sprite = this.add.sprite(200, 300, 'robot');
this.matter.add.gameObject(sprite, compoundBody);
  • Спрайт будет следовать за физическим телом.
  • Можно использовать анимации и менять текстуры без нарушения физики.
  • Любые силы, столкновения или вращения, применяемые к составному телу, визуально отражаются на спрайте.

Примеры использования

  • Транспортные средства: машина с колесами и кузовом, каждое колесо — отдельная часть.
  • Враги с подвижными частями: робот с руками, ногами и головой, части могут отделяться при повреждении.
  • Разрушаемые объекты: кирпичная стена, где каждый кирпич — часть составного тела или группы.

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