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

Встроенные функции плавности (easing) в Phaser позволяют создавать естественные и привлекательные анимации. Однако их поведение часто можно тонко настроить под свои нужды. В этой статье мы разберем, как использовать параметр `easeParams` для изменения стандартного поведения эффекта `Back.ease`, что позволяет добиться более выраженного или, наоборот, более сдержанного "отскока" анимации. Это ключевой навык для создания уникальной игровой динамики.

Версия 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');

        //  The 'Back' ease takes one argument: overshoot.
        //  The default value is 1.70158
        //  But you can set whatever you like in the easeParams array

        this.tweens.add({
            targets: image,
            x: 600,
            duration: 3000,
            ease: 'Back',
            easeParams: [3.5],
            delay: 1000,
            yoyo: true,
            loop: -1
        });
    }

}

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

const game = new Phaser.Game(config);

Разбираем пример: настройка Back.ease

Представленный код создает базовую сцену с одним спрайтом, который перемещается по горизонтали с эффектом "отскока" (overshoot) в начале и конце анимации. По умолчанию эффект Back.ease имеет параметр overshoot со значением 1.70158. В примере это значение увеличено до 3.5, что делает "отскок" более экстремальным.

Сначала в методе 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');

Создание и настройка твина

Анимация создается с помощью this.tweens.add(). Ключевые параметры: - targets: объект для анимации. - `x`: целевая координата. - duration: длительность в миллисекундах. - ease: функция плавности. - yoyo и loop: заставляют анимацию повторяться.

Обратите внимание на параметр easeParams. Это массив, в который передаются дополнительные аргументы для выбранной функции плавности. Для Back.ease это один аргумент — сила overshoot.

this.tweens.add({
    targets: image,
    x: 600,
    duration: 3000,
    ease: 'Back',
    easeParams: [3.5], // Увеличиваем силу "отскока"
    delay: 1000,
    yoyo: true,
    loop: -1
});

Как работает параметр overshoot?

Параметр overshoot (перерегулирование) в Back.ease определяет, насколько сильно анимация "пролетит" за целевую точку перед тем, как вернуться к ней. Это создает эффект упругости или инерции.

- Значение **по умолчанию (1.70158)** дает умеренный, приятный глазу отскок. - **Большее значение (например, 3.5)** делает анимацию более "пружинистой" и драматичной. Объект сильнее залетает за конечную позицию. - **Меньшее значение (например, 0.5)** смягчает эффект, делая отскок почти незаметным. - **Значение 0** отключает эффект отскока, превращая Back.ease в линейную или другую базовую интерполяцию (в зависимости от реализации).

Экспериментируя с этим числом, вы можете подобрать идеальное ощущение веса и упругости для объектов в вашей игре.

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

Код завершается стандартной конфигурацией игры Phaser, которая задает размеры холста, цвет фона и указывает используемый класс сцены.

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

const game = new Phaser.Game(config);

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

Использование easeParams открывает тонкий контроль над встроенными функциями плавности Phaser. Вы можете не только усилить эффект Back.ease, но и настраивать другие easing-функции, которые принимают параметры (например, Elastic.ease). Для экспериментов попробуйте: 1. Изменить значение в easeParams на отрицательное. 2. Применить easeParams к другим функциям, указанным в документации Phaser. 3. Связать силу overshoot с игровой логикой (например, чем сильнее удар, тем больше отскок).