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

Tween (или анимация) — один из ключевых инструментов для оживления игровых объектов. Phaser предоставляет мощную и гибкую систему твинов через `this.tweens`. В этом примере мы разберем, как создать базовое, бесконечно повторяющееся линейное движение. Линейный ease (`'linear'`) — это самый простой тип плавности, при котором объект движется с постоянной скоростью, что идеально подходит для механических или предсказуемых перемещений, например, движения фона, платформ или пуль.

Версия 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.image('bg', 'assets/tweens/space.png');
        this.load.image('ufo', 'assets/tweens/ufo2.png');
    }

    create ()
    {
        this.add.image(400, 300, 'bg');
        this.add.text(20, 20, 'Linear Ease').setFontSize(32).setShadow(2, 2);

        const ufo = this.add.image(100, 300, 'ufo');

        this.tweens.add({
            targets: ufo,
            x: 700,
            duration: 2000,
            repeat: -1,
            hold: 500,
            repeatDelay: 500,
            ease: 'linear'
        });
    }
}

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

const game = new Phaser.Game(config);

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

Как и в любой сцене Phaser, мы начинаем с методов жизненного цикла. В preload загружаются изображения, необходимые для примера. Обратите внимание на использование setBaseURL — это удобный способ задать базовый путь для всех последующих загрузок.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('bg', 'assets/tweens/space.png');
    this.load.image('ufo', 'assets/tweens/ufo2.png');
}

В методе create мы сначала создаем статичный фон и текстовую метку. Затем создаем наш целевой объект — изображение НЛО, которое будем анимировать. Его начальная позиция — (100, 300).

Создание и конфигурация твина

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

this.tweens.add({
    targets: ufo,
    x: 700,
    duration: 2000,
    repeat: -1,
    hold: 500,
    repeatDelay: 500,
    ease: 'linear'
});

Давайте разберем ключевые свойства: - targets: Указывает, к каким объектам применяется твин. Это может быть один объект или массив. - x: 700: Свойство, которое нужно анимировать, и его конечное значение. Твин плавно изменит координату `x` объекта от текущего значения до 700. - duration: Длительность одного цикла анимации в миллисекундах (2000 мс = 2 секунды). - ease: 'linear': Функция плавности (easing). 'linear' означает отсутствие ускорения или замедления — движение с постоянной скоростью. - repeat: -1: Количество повторений. Значение -1 задает бесконечное повторение. - hold: Время в миллисекундах, в течение которого твин будет удерживать конечное значение перед началом повторения или завершением. - repeatDelay: Задержка в миллисекундах перед началом каждого повторения после этапа hold.

Как работают `hold` и `repeatDelay`

Сочетание hold и repeatDelay создает четкий цикл анимации, который легко визуализировать: 1. **Движение:** Объект перемещается из точки A (x=100) в точку B (x=700) за 2000 мс. 2. **Удержание (hold):** Объект остается в точке B 500 мс. 3. **Задержка повтора (repeatDelay):** Проходит еще 500 мс паузы. 4. **Повтор:** Цикл начинается снова, и объект мгновенно возвращается в точку A (так как мы анимируем только свойство `xдо 700, а не обратно). На практике для движения "туда-обратно" нужно анимировать свойство обратно или использовать другой подход, напримерyoyo`.

Таким образом, полный цикл (движение + паузы) занимает 2000 + 500 + 500 = 3000 мс.

Конфигурация игры

Код завершается стандартной конфигурацией игры Phaser и ее инициализацией. Обратите внимание, что scene указывает на наш класс Example.

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

const game = new Phaser.Game(config);

Эта конфигурация создает игровое окно размером 800x600 пикселей с темно-серым фоном (#2d2d2d) и помещает его в HTML-элемент с id='phaser-example'.

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

Линейные твины — это фундаментальный строительный блок для анимации в Phaser. Они дают полный контроль над временем и повторением движения. Для экспериментов попробуйте: 1. Заменить ease: 'linear' на 'Power2', 'Bounce' или 'Elastic', чтобы увидеть, как меняется характер движения. 2. Добавить свойство yoyo: true, чтобы объект автоматически возвращался в начальную позицию, создавая цикл "туда-обратно". 3. Анимировать несколько свойств одновременно, например, `x,yиangle`, чтобы создать более сложную траекторию. 4. Управлять твином динамически: назначать его переменной и затем использовать методы .pause(), .resume() или .stop().