О чем этот пример

При разработке игр часто возникает необходимость сохранить состояние физического мира или передать его по сети. Phaser с плагином Matter.js предоставляет для этого элегантное решение — метод `toJSON()`. Эта статья покажет, как легко сериализовать любое тело Matter в стандартный JSON-формат. Вы научитесь извлекать все ключевые параметры тела (позицию, скорость, угол и свойства материала) для их дальнейшего использования в сохранениях игры, реплеях или для отладки сложных физических взаимодействий.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('block', 'assets/sprites/block.png');
        this.load.image('platform', 'assets/sprites/platform.png');
    }

    create ()
    {
        // this.matter.add.image(400, 550, 'platform', null, { isStatic: true });

        const block = this.matter.add.sprite(400, 300, 'block');

        const data = block.toJSON();

        console.log(data);
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#1b1464',
    parent: 'phaser-example',
    physics: {
        default: 'matter',
        matter: {
            gravity: {
                x: 0,
                y: 0
            }
        }
    },
    scene: Example
};

const game = new Phaser.Game(config);

Зачем нужна сериализация тела?

Метод toJSON() объекта тела Matter.js преобразует все его физические свойства в простой JavaScript-объект. Это полезно в нескольких сценариях:

* **Сохранение игры:** Вы можете записать состояние всех тел в уровне, чтобы позже восстановить его. * **Сетевая синхронизация:** В мультиплеерных играх JSON-представление тела можно отправить другим игрокам. * **Отладка:** Вместо того чтобы вручную выводить множество свойств, вы одним вызовом получаете полную картину состояния объекта в консоли.

В предоставленном примере показана базовая работа этого метода. Давайте разберем его по шагам.

Подготовка сцены и физики

В первую очередь мы настраиваем сцену и физический движок Matter.js. Ключевой момент — правильная конфигурация в объекте config.

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#1b1464',
    parent: 'phaser-example',
    physics: {
        default: 'matter', // Активируем Matter.js как физический движок
        matter: {
            gravity: {
                x: 0,
                y: 0 // Для наглядности отключаем гравитацию
            }
        }
    },
    scene: Example
};

В методе preload() загружаются спрайты, которые будут использоваться в качестве физических тел. this.load.setBaseURL задает базовый путь для удобства.

Создание тела и вызов toJSON()

В методе create() создается физическое тело — спрайт-блок. Обратите внимание, что используется this.matter.add.sprite, который автоматически создает для спрайта твердое тело.

create ()
{
    const block = this.matter.add.sprite(400, 300, 'block');
    const data = block.toJSON();
    console.log(data);
}

Метод toJSON() вызывается непосредственно на созданном объекте block. Он возвращает объект с данными, который затем выводится в консоль. Важно понимать, что метод сериализует именно физическое тело (body), привязанное к спрайту, а не сам спрайт.

Что внутри полученных данных?

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

on
{
  "type": "body",
  "label": "Блок",
  "position": { "x": 400, "y": 300 },
  "velocity": { "x": 0, "y": 0 },
  "angle": 0,
  "vertices": [ ... ],
  "render": { ... },
  "friction": 0.1,
  "frictionStatic": 0.5,
  "frictionAir": 0.01,
  "restitution": 0
}

* type и label идентифицируют объект. * position, angle и velocity описывают состояние движения. * vertices — это массив точек, определяющих форму (хитбокс) тела. * render содержит свойства, связанные с отображением. * Остальные свойства (friction, restitution и т.д.) определяют физическое поведение тела при столкновениях.

Что попробовать дальше

Метод toJSON() — это мощный и простой инструмент для работы с данными физических тел в Matter.js. Он открывает путь к созданию систем сохранения, инструментов для отладки сложных симуляций и сетевого геймплея. **Идеи для экспериментов:** 1. Модифицируйте тело (примените силу, измените угол), а затем снова вызовите toJSON() — вы увидите, как обновились данные о скорости и позиции. 2. Попробуйте создать простой "сейв": сохраните массив JSON-данных для всех тел в сцене в localStorage. 3. Исследуйте, как сериализовать не одно тело, а весь мир, используя this.matter.world.toJSON().