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

Экспорт данных анимации в JSON — мощный инструмент для отладки, сохранения состояний или интеграции с редакторами. В этой статье разберем, как получить структурированное представление ваших анимаций в Phaser 3, используя встроенные методы API. Вы научитесь извлекать данные как для одной анимации, так и для всего менеджера, что полезно при создании инструментов или переносе контента между проектами.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.atlas('gems', 'assets/tests/columns/gems.png', 'assets/tests/columns/gems.json');
    }

    create ()
    {
        this.add.text(400, 32, 'Check the console', { color: '#00ff00' }).setOrigin(0.5, 0);

        this.anims.create({ key: 'diamond', frames: this.anims.generateFrameNames('gems', { prefix: 'diamond_', end: 15, zeroPad: 4 }), repeat: -1 });
        this.anims.create({ key: 'prism', frames: this.anims.generateFrameNames('gems', { prefix: 'prism_', end: 6, zeroPad: 4 }), repeat: -1 });
        this.anims.create({ key: 'ruby', frames: this.anims.generateFrameNames('gems', { prefix: 'ruby_', end: 6, zeroPad: 4 }), repeat: -1 });
        this.anims.create({ key: 'square', frames: this.anims.generateFrameNames('gems', { prefix: 'square_', end: 14, zeroPad: 4 }), repeat: -1 });

        this.add.sprite(400, 200, 'gems').play('diamond');
        this.add.sprite(400, 300, 'gems').play('prism');
        this.add.sprite(400, 400, 'gems').play('ruby');
        this.add.sprite(400, 500, 'gems').play('square');

        //  Get a JSON representation of a single animation, or all animations:

        //  You can extract the animation:
        var ruby = this.anims.get('ruby');

        //  Then pass it to JSON.stringify
        console.log(JSON.stringify(ruby));

        //  Or call toJSON directly (this returns an Object)
        console.log(ruby.toJSON());

        //  You can also call 'this.anims.toJSON' and pass it the key of the animation you want:
        console.log(JSON.stringify(this.anims.toJSON('ruby')));

        //  Or dump out ALL animations in the Animation Manager:
        console.log(JSON.stringify(this.anims));
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: Example
};

const game = new Phaser.Game(config);

Подготовка анимаций

Прежде чем экспортировать анимации, их нужно создать и запустить. В примере используется атлас gems, из которого генерируются кадры для четырех анимаций: diamond, prism, ruby и square. Ключевой метод this.anims.generateFrameNames автоматически создает массив кадров на основе префикса и конечного индекса.

this.anims.create({ key: 'ruby', frames: this.anims.generateFrameNames('gems', { prefix: 'ruby_', end: 6, zeroPad: 4 }), repeat: -1 });

После создания анимации применяются к спрайтам с помощью метода play. Это стандартный процесс, который гарантирует, что анимации зарегистрированы в менеджере и готовы к экспорту.

Экспорт одной анимации через get() и toJSON

Самый прямой способ получить данные одной анимации — использовать метод this.anims.get('ключ'). Он возвращает экземпляр анимации, который затем можно преобразовать в JSON.

var ruby = this.anims.get('ruby');
console.log(JSON.stringify(ruby));

Альтернативно, у экземпляра анимации есть метод toJSON(), который возвращает обычный JavaScript-объект с данными анимации. Этот объект уже структурирован и готов к сериализации или дальнейшей обработке.

console.log(ruby.toJSON());

Оба подхода дают одинаковый результат, но toJSON() может быть удобнее, если вам нужен объект, а не строка.

Использование метода this.anims.toJSON()

Менеджер анимаций this.anims предоставляет собственный метод toJSON(), который может принимать ключ анимации в качестве аргумента. Это компактный способ получить данные без промежуточного получения экземпляра.

console.log(JSON.stringify(this.anims.toJSON('ruby')));

Если вызвать this.anims.toJSON() без аргументов, он вернет данные всех анимаций. Однако в примере показана передача ключа, что полезно для точечного экспорта.

Экспорт всех анимаций из менеджера

Чтобы получить полный снимок всех анимаций, зарегистрированных в сцене, можно сериализовать сам объект this.anims. При передаче в JSON.stringify автоматически вызывается внутренний метод toJSON, который собирает данные по всем анимациям.

console.log(JSON.stringify(this.anims));

В консоли вы увидите массив объектов, каждый из которых соответствует одной анимации. Это полезно для отладки сложных сцен или сохранения состояния анимаций целиком.

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

Экспорт анимаций в JSON в Phaser 3 — это простой, но мощный механизм для работы с данными. Вы можете использовать его для создания инструментов визуализации, сохранения настроек анимаций в файл или отправки данных на сервер. Попробуйте модифицировать пример: сохраните вывод this.anims.toJSON() в переменную и программно измените параметры, например, скорость воспроизведения, а затем восстановите анимации из полученного объекта.