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

Вращение спрайтов — одна из самых частых операций в игровой разработке. В Phaser это делается просто и эффективно через свойство `rotation`. В этой статье мы разберем готовый пример, показывающий, как создать два изображения и вращать их в противоположных направлениях. Это знание станет основой для анимации вращения игровых персонажей, стрелок, платформ и других объектов.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    image2;
    image1;

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');

        this.load.image('arrow', 'assets/sprites/arrow.png');

    }

    create ()
    {

        this.image1 = this.add.image(300, 300, 'arrow');
        this.image2 = this.add.image(400, 300, 'arrow');

        this.image1.name = 'bill';
        this.image2.name = 'ben';

    }

    update ()
    {

        this.image1.rotation += 0.01;
        this.image2.rotation -= 0.01;

    }
}

const config = {
    type: Phaser.CANVAS,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

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

Класс Example наследуется от Phaser.Scene. В методе preload() мы загружаем изображение. Важно: this.load.setBaseURL() задает базовый путь для всех последующих загрузок. Это удобно, если все ваши ассеты лежат в одной папке.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('arrow', 'assets/sprites/arrow.png');
}

Здесь загружается изображение стрелки с ключом 'arrow'. Ключ — это внутреннее имя ассета, по которому мы будем создавать игровые объекты.

Создание и настройка игровых объектов

Метод create() запускается один раз после загрузки ресурсов. Здесь мы создаем два изображения (this.add.image) на сцене, используя загруженный ключ 'arrow'. Первые два аргумента метода — это координаты X и Y.

create ()
{
    this.image1 = this.add.image(300, 300, 'arrow');
    this.image2 = this.add.image(400, 300, 'arrow');
    this.image1.name = 'bill';
    this.image2.name = 'ben';
}

Оба изображения создаются из одного и того же ассета, но это два независимых объекта. Свойство name — это необязательная пользовательская метка для удобства отладки.

Анимация вращения в игровом цикле

Сердце любого движения в Phaser — метод update(), который вызывается на каждом кадре. Чтобы объект вращался, мы изменяем его свойство rotation. Оно принимает значение в радианах.

update ()
{
    this.image1.rotation += 0.01;
    this.image2.rotation -= 0.01;
}

Здесь this.image1 вращается по часовой стрелке (значение увеличивается), а this.image2 — против часовой (значение уменьшается). Скорость вращения (0.01 радиана за кадр) определяет плавность анимации.

Инициализация игры: конфигурация

Для запуска игры необходим объект конфигурации config. В нем мы указываем тип рендерера (Phaser.CANVAS), родительский HTML-элемент и класс нашей сцены.

const config = {
    type: Phaser.CANVAS,
    parent: 'phaser-example',
    scene: Example
};
const game = new Phaser.Game(config);

После создания экземпляра Phaser.Game Phaser автоматически управляет жизненным циклом сцены, вызывая preload(), create() и update() в нужное время.

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

Вращение объектов в Phaser сводится к изменению свойства rotation в методе update(). Это простая, но мощная механика. Для экспериментов попробуйте изменить скорость вращения, привязать ее к времени кадра (this.time.delta), вращать объекты вокруг другой точки с помощью setOrigin() или заставить объект вращаться в сторону курсора мыши.