О чем этот пример
Визуальные эффекты — ключ к созданию привлекательных игр. 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.atlas('assets', 'assets/atlas/tweenparts.png', 'assets/atlas/tweenparts.json');
}
create ()
{
const chest = this.add.image(400, 600, 'assets', 'blue-open').setOrigin(0.5, 1);
// After 2 seconds the frame will change to 'blue-open'
this.tweens.add({
targets: chest,
texture: [ 'assets', 'blue-closed' ],
duration: 500,
repeat: -1,
yoyo: true,
y: chest.y - 50,
scaleY: 1.2,
ease: 'Back.out'
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка ассетов: загрузка атласа
Для работы с несколькими кадрами (текстурами) одного объекта удобно использовать Texture Atlas — изображение, содержащее набор спрайтов, и JSON-файл с координатами каждого кадра. Это позволяет загрузить все необходимые текстуры одной командой и обращаться к ним по имени.
В методе preload мы загружаем атлас с помощью this.load.atlas. Первый аргумент — ключ атласа ('assets'), по которому мы будем к нему обращаться. Второй и третий — пути к файлам изображения и данных соответственно.
this.load.atlas('assets', 'assets/atlas/tweenparts.png', 'assets/atlas/tweenparts.json');
Создание объекта и настройка Tween
В методе create мы создаем основной объект — изображение сундука. Метод this.add.image принимает координаты X, Y, ключ текстуры (атласа) и имя конкретного кадра из этого атласа для начального отображения. С помощью .setOrigin(0.5, 1) мы устанавливаем точку привязки (origin) спрайта: 0.5 по X (центр) и 1 по Y (нижний край). Это нужно, чтобы анимация движения вверх происходила от "дна" сундука.
const chest = this.add.image(400, 600, 'assets', 'blue-open').setOrigin(0.5, 1);
Затем создается анимация (Tween) с помощью this.tweens.add. Объектом анимации (targets) является наш сундук (chest).
Сердце анимации: свойство `texture` и параметры Tween
Ключевой момент — использование свойства texture в конфигурации Tween. Оно принимает массив, где первый элемент — ключ текстуры (атласа), а второй — имя целевого кадра. Tween плавно сменит текущий кадр объекта на указанный в процессе своей работы.
texture: [ 'assets', 'blue-closed' ]
Остальные параметры настраивают поведение анимации:
- duration: длительность одного цикла в миллисекундах (500 мс).
- repeat: количество повторений (-1 для бесконечного повтора).
- yoyo: если true, анимация будет проигрываться в прямом и обратном порядке.
- `yиscaleY`: свойства, которые также анимируются параллельно со сменой текстуры (поднятие на 50 пикселей и растяжение по высоте).
- ease: функция плавности 'Back.out', которая создает эффект "отскока" в конце движения.
this.tweens.add({
targets: chest,
texture: [ 'assets', 'blue-closed' ],
duration: 500,
repeat: -1,
yoyo: true,
y: chest.y - 50,
scaleY: 1.2,
ease: 'Back.out'
});
В итоге сундук бесконечно открывается и закрывается (blue-open <-> blue-closed), одновременно подпрыгивая и немного деформируясь.
Конфигурация игры и запуск сцены
Код завершается стандартной конфигурацией игры (config) и ее созданием. В конфиге указаны базовые настройки: тип рендерера, размеры холста, цвет фона, ID родительского HTML-элемента и класс основной сцены (Example).
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Tween в Phaser — это мощный и гибкий инструмент для создания плавных анимаций, который умеет работать не только с числовыми свойствами вроде координат, но и с текстурами. Использование свойства texture в Tween позволяет легко оживлять объекты, меняя их внешний вид в такт движению. Для экспериментов попробуйте: анимировать несколько свойств одновременно (угол поворота, прозрачность), создать цепочку Tween-ов с помощью chain, применить разные функции плавности (ease) к разным свойствам или управлять анимацией по событию (например, по клику).
