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

Tween-анимации в Phaser упрощают создание плавных переходов и движений объектов. Однако управление этими анимациями — ключевой навык для создания интерактивных сцен. В этой статье мы разберём, как остановить выполняющийся tween по событию (например, клику мыши), что позволяет мгновенно реагировать на действия игрока и создавать более динамичный геймплей.

Версия 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('block', 'assets/sprites/block.png');
    }

    create()
    {
        var marker = this.add.image(100, 300, 'block').setAlpha(0.3);
        var image = this.add.image(100, 300, 'block');

        var tween = this.tweens.add({
            targets: image,
            x: 700,
            delay: 1000,
            duration: 6000,
            ease: 'Power2'
        });

        this.input.on('pointerdown', function () 
        {

            tween.stop();

        });
    }
}

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

const game = new Phaser.Game(config);

Основы tween анимации в Phaser

Класс Phaser.Tweens.TweenManager (доступный через this.tweens) управляет всеми анимациями на сцене. Метод .add() создаёт новый tween, который автоматически запускается и воспроизводится один раз, если не указаны дополнительные параметры.

var tween = this.tweens.add({
    targets: image,
    x: 700,
    delay: 1000,
    duration: 6000,
    ease: 'Power2'
});

В этом примере мы создаём анимацию для объекта image, которая через задержку в 1 секунду (delay) плавно переместит его по оси X до позиции 700 за 6 секунд (duration). Функция плавности Power2 задаёт характер движения. Метод .add() возвращает экземпляр класса Phaser.Tweens.Tween, который мы сохраняем в переменной tween для дальнейшего управления.

Сохранение ссылки на tween

Для управления анимацией (остановки, перезапуска, изменения параметров) необходимо сохранить ссылку на объект tween, который возвращает метод this.tweens.add(). Если ссылка не сохранена, у вас не будет программного доступа к конкретной анимации для её остановки.

// Сохраняем возвращаемый объект tween в переменную
var tween = this.tweens.add({ /* конфигурация */ });

В примере эта ссылка хранится в переменной tween в области видимости метода create(), что делает её доступной для обработчика события клика.

Остановка tween по событию

Phaser предоставляет систему событий ввода (this.input). Мы можем привязать выполнение функции к событию, например, клику мышью (pointerdown) в любом месте игрового поля.

this.input.on('pointerdown', function () {
    tween.stop();
});

Внутри функции-обработчика мы вызываем метод .stop() у сохранённого ранее объекта tween. Этот метод немедленно прекращает воспроизведение анимации. Объект-цель (image) останется в той позиции, в которой его застала команда остановки.

Поведение метода .stop()

Метод tween.stop() выполняет мгновенную остановку анимации. Важно понимать его ключевые особенности: 1. **Немедленное прекращение:** Анимация останавливается в текущем кадре. 2. **Сохранение состояния:** Объект-цель остаётся в своём текущем положении и состоянии. 3. **Управление через ссылку:** Метод должен быть вызван у конкретного экземпляра tween.

// После вызова этой функции image перестанет двигаться
// и останется, например, на координате x = 450
tween.stop();

Это отличается от методов .pause() (приостановка с возможностью возобновления) или .restart() (сброс и запуск с начала).

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

Умение останавливать tween анимации по требованию открывает путь к созданию отзывчивых игровых механик. Вы можете экспериментировать: остановить анимацию при столкновении, по таймеру, или комбинировать .stop() с другими методами управления — .pause(), .resume(), .play() и .restart(). Попробуйте создать сцену, где несколько объектов движутся, и игрок должен кликать на них, чтобы заморозить, — это отличная практика для усвоения материала.