О чем этот пример
Запуск анимации в Phaser — это проще, чем кажется, но настоящая магия начинается, когда вы хотите управлять её скоростью, задержками и другими параметрами прямо в момент воспроизведения. Метод `sprite.play()` принимает не только ключ анимации, но и конфигурационный объект, позволяя динамически переопределять свойства, заданные при создании анимации. Эта статья покажет, как гибко управлять анимациями, чтобы ваши игровые объекты двигались именно так, как вам нужно, прямо в коде их создания.
Версия 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('cube', 'assets/animations/cube.png', 'assets/animations/cube.json');
}
create ()
{
// Our global 'spin' animation
this.anims.create({
key: 'spin',
frames: this.anims.generateFrameNames('cube', { prefix: 'frame', start: 1, end: 23 }),
frameRate: 50,
repeat: -1
});
const colors = [ 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, 0xbd208c ];
const sprite1 = this.add.sprite(200, 300, 'cube').setTint(colors[0]);
const sprite2 = this.add.sprite(400, 300, 'cube').setTint(colors[1]);
const sprite3 = this.add.sprite(600, 300, 'cube').setTint(colors[2]);
// Play the 'spin' animation
sprite1.play({ key: 'spin' });
// Play the animation and override the default frameRate with a new one
sprite2.play({ key: 'spin', frameRate: 20 });
// Play the animation and set the repeatDelay to 250ms
sprite3.play({ key: 'spin', repeatDelay: 250 });
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов и создание анимации
Перед использованием анимации её необходимо создать. В методе preload загружается атлас — изображение с несколькими кадрами и JSON-файл, описывающий их расположение.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.atlas('cube', 'assets/animations/cube.png', 'assets/animations/cube.json');
}
В методе create создаётся глобальная анимация 'spin'. Метод this.anims.generateFrameNames автоматически генерирует массив кадров из атласа по заданному шаблону имени. Параметры repeat: -1 и frameRate: 50 устанавливаются по умолчанию.
this.anims.create({
key: 'spin',
frames: this.anims.generateFrameNames('cube', { prefix: 'frame', start: 1, end: 23 }),
frameRate: 50,
repeat: -1
});
Базовый запуск анимации
Самый простой способ запустить анимацию на спрайте — передать методу play() её ключ. В этом случае будут использованы все параметры, заданные при создании анимации 'spin' через this.anims.create().
const sprite1 = this.add.sprite(200, 300, 'cube').setTint(colors[0]);
sprite1.play({ key: 'spin' });
Обратите внимание, что play() ожидает объект конфигурации, даже если в нём только один параметр key. Это единообразный подход для всех вариантов вызова.
Переопределение скорости воспроизведения
Часто требуется, чтобы один и тот же анимационный цикл воспроизводился с разной скоростью у разных объектов. Например, чтобы создать эффект замедленного вращения. Это легко сделать, передав в конфиг параметр frameRate.
const sprite2 = this.add.sprite(400, 300, 'cube').setTint(colors[1]);
sprite2.play({ key: 'spin', frameRate: 20 });
Здесь анимация 'spin' для sprite2 будет проигрываться со скоростью 20 кадров в секунду, вместо 50, заданных при её создании. Это не изменяет исходную анимацию, а лишь создаёт её локальную вариацию для конкретного спрайта.
Управление паузами между повторами
Ещё один мощный параметр — repeatDelay. Он устанавливает задержку в миллисекундах между завершением одного цикла анимации и началом следующего. Это полезно для создания эффекта "мерцания", "подёргивания" или любой другой прерывистой анимации.
const sprite3 = this.add.sprite(600, 300, 'cube').setTint(colors[2]);
sprite3.play({ key: 'spin', repeatDelay: 250 });
Теперь куб будет вращаться, затем делать паузу в четверть секунды, и только потом запускать вращение снова. Это добавляет анимации характер и делает её менее механической.
Что попробовать дальше
Метод sprite.play() в Phaser — это ваш инструмент для динамического контроля анимаций. Вы можете не только запускать их, но и тонко настраивать под конкретные нужды сцены или объекта. Для экспериментов попробуйте комбинировать параметры: например, установите одновременно низкий frameRate и большой repeatDelay для создания вялого, прерывистого движения. Или используйте delay, чтобы запустить анимацию не сразу, а через заданное время. Изучите другие параметры конфига в документации, такие как timeScale или showOnStart, чтобы расширить свои возможности.
