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

Анимации движения — основа динамичных игр. В Phaser для их создания часто используют Tween-систему. Иногда требуется запустить анимацию не сразу, а по событию или после паузы. Этот пример показывает, как создать Tween, изначально поставленный на паузу, и затем запустить его в нужный момент. Это полезно для синхронизации анимаций с игровыми событиями, такими как появление врага или реакция на действие игрока.

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

Живой запуск

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

Исходный код


var config = {
    type: Phaser.WEBGL,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: {
        preload: preload,
        create: create
    }
};

var game = new Phaser.Game(config);

function preload ()
{
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.spritesheet('fish', 'assets/sprites/fish-136x80.png', { frameWidth: 136, frameHeight: 80 });
}

function create ()
{
    var image1 = this.add.image(0, 80, 'fish', 0);

    var tween = this.tweens.add({
        targets: image1,
        props: {
            x: { value: 700, duration: 4000, flipX: true },
            y: { value: 500, duration: 8000,  },
        },
        ease: 'Sine.easeInOut',
        yoyo: true,
        repeat: -1,
        paused: true
    });

    tween.play();
}

Настройка сцены и загрузка ассетов

В этом примере используется стандартная конфигурация игры Phaser с предзагрузкой и созданием сцены.

var config = {
    type: Phaser.WEBGL,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: {
        preload: preload,
        create: create
    }
};

var game = new Phaser.Game(config);

Функция preload загружает спрайтшит, который будет использоваться для анимации. Обратите внимание, что базовая ссылка задаётся через this.load.setBaseURL, а сам спрайтшит загружается методом this.load.spritesheet. Второй и третий аргументы метода определяют ширину и высоту одного кадра.

function preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.spritesheet('fish', 'assets/sprites/fish-136x80.png', { frameWidth: 136, frameHeight: 80 });
}

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

В функции create мы создаём игровой объект — изображение рыбы — и настраиваем для него анимацию перемещения (Tween).

var image1 = this.add.image(0, 80, 'fish', 0);

Объект image1 создаётся с начальными координатами (0, 80) и использует первый кадр (индекс 0) из загруженного спрайтшита.

Теперь создадим сам Tween. Ключевой параметр здесь — paused: true. Он указывает системе, что анимация не должна запускаться автоматически сразу после создания.

var tween = this.tweens.add({
    targets: image1,
    props: {
        x: { value: 700, duration: 4000, flipX: true },
        y: { value: 500, duration: 8000,  },
    },
    ease: 'Sine.easeInOut',
    yoyo: true,
    repeat: -1,
    paused: true
});

Разберём параметры конфигурации: - targets: объект или массив объектов, к которым применяется анимация. - props.x и props.y: определяют анимацию перемещения по осям. Каждое свойство имеет конечное value и длительность duration. Для оси X также включён flipX: true, который зеркально отразит спрайт при движении. - ease: функция плавности Sine.easeInOut обеспечивает плавное ускорение и замедление. - yoyo: true: после завершения анимации она проиграется в обратном порядке. - repeat: -1: анимация будет повторяться бесконечно. - paused: true: анимация создаётся в приостановленном состоянии.

Запуск анимации методом play()

Поскольку Tween был создан с флагом paused, он не начнётся сам. Для его запуска необходимо явно вызвать метод play() у объекта tween.

tween.play();

В данном примере вызов происходит сразу после создания tween, поэтому разницы в визуальном результате не будет. Однако этот подход становится мощным инструментом, когда запуск нужно привязать к игровому событию: клику мыши, коллизии, таймеру или загрузке уровня.

Метод play() можно вызывать многократно и комбинировать с другими методами управления анимацией, такими как pause(), resume(), restart() и stop().

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

Использование флага paused при создании Tween даёт полный контроль над моментом старта анимации. Это основа для создания реактивного и синхронизированного геймплея. Поэкспериментируйте: попробуйте запустить Tween по клику на объект, после прохождения определённой дистанции или в зависимости от состояния игры. Также можно управлять несколькими «приостановленными» анимациями, запуская их в разной последовательности для создания сложных сцен.