Библиотека Phaser предоставляет гибкий механизм управления анимациями спрайтов. Помимо базового воспроизведения кадров, важное значение имеют реверс (обратное воспроизведение) и изменение скорости проигрывания. Эти инструменты позволяют реализовывать эффекты замедленного движения, «отмотки времени», зеркальных анимаций, динамического управления состояниями персонажа и визуальных акцентов.
В основе системы лежат объекты:
Phaser.Animations.Animation — описание анимации (набор
кадров, частота, режим повтора).Phaser.Animations.AnimationState — состояние
воспроизведения конкретного спрайта.Phaser.GameObjects.Sprite — объект, на котором
проигрывается анимация.Создание анимации выполняется через
this.anims.create():
this.anims.create({
key: 'run',
frames: this.anims.generateFrameNumbers('player', { start: 0, end: 7 }),
frameRate: 12,
repeat: -1
});
Параметр frameRate определяет количество кадров в
секунду, а repeat задаёт число повторов (-1 —
бесконечно).
yoyoПростейший способ реализовать обратное воспроизведение — включить
параметр yoyo.
this.anims.create({
key: 'pulse',
frames: this.anims.generateFrameNumbers('orb', { start: 0, end: 5 }),
frameRate: 10,
repeat: -1,
yoyo: true
});
Принцип работы:
Этот метод подходит для циклических эффектов (пульсация, мигание, дыхание).
reverse()Метод reverse() объекта AnimationState
позволяет динамически изменить направление:
let sprite = this.add.sprite(100, 100, 'player');
sprite.play('run');
// В какой-то момент:
sprite.anims.reverse();
Особенности:
Это удобно для механик «перемотки времени» или смены состояния движения.
Метод playReverse() позволяет начать проигрывание с
конца:
sprite.playReverse('run');
Поведение:
repeat и yoyo.Свойство sprite.anims.forward показывает текущее
направление:
if (!sprite.anims.forward) {
// Анимация воспроизводится в обратную сторону
}
Это важно при построении логики состояний и синхронизации физики с визуализацией.
frameRate при созданииСтатическая скорость задаётся при создании анимации:
this.anims.create({
key: 'slowWalk',
frames: this.anims.generateFrameNumbers('player', { start: 0, end: 7 }),
frameRate: 6,
repeat: -1
});
Меньший frameRate — более медленная анимация.
timeScaleДля динамического изменения скорости используется
timeScale.
sprite.play('run');
sprite.anims.timeScale = 0.5;
Значения:
1 — нормальная скорость0.5 — замедление в 2 раза2 — ускорение в 2 раза0 — полная остановкаКлючевая особенность: timeScale влияет
только на конкретную анимацию спрайта.
Менеджер анимаций сцены также имеет globalTimeScale:
this.anims.globalTimeScale = 0.3;
Эффект:
Пример логики:
activateSlowMotion() {
this.anims.globalTimeScale = 0.3;
this.physics.world.timeScale = 0.3;
this.time.delayedCall(2000, () => {
this.anims.globalTimeScale = 1;
this.physics.world.timeScale = 1;
});
}
В данном случае:
Мгновенное изменение timeScale создаёт резкий переход.
Для плавного эффекта используется система tween.
this.tweens.add({
targets: sprite.anims,
timeScale: 0.2,
duration: 1000,
ease: 'Linear'
});
Результат:
sprite.anims.pause();
sprite.anims.resume();
sprite.anims.stop();
Различия:
pause() сохраняет текущий кадр.stop() завершает анимацию и может сбросить
состояние.Интересные эффекты возникают при совместном применении:
sprite.play('run');
sprite.anims.timeScale = 0.5;
sprite.anims.reverse();
Возможные сценарии:
Phaser генерирует события:
animationstartanimationupdateanimationrepeatanimationcompleteПример:
sprite.on('animationcomplete', (animation) => {
if (animation.key === 'run') {
sprite.playReverse('run');
}
});
Так реализуется автоматический реверс после завершения.
Пример механики отката движения:
update() {
if (this.input.keyboard.isDown(Phaser.Input.Keyboard.KeyCodes.R)) {
this.player.anims.reverse();
this.player.setVelocityX(-100);
}
}
В результате:
Реверс и изменение timeScale не создают новых массивов
кадров. Phaser просто меняет:
Поэтому операции выполняются быстро и не требуют дополнительной памяти.
timeScale не влияет на звук.timeScale = 0 анимация «замирает», но события сцены
продолжают работать.yoyo следует учитывать параметр
repeat, иначе анимация завершится после одного цикла.В проектах с Arcade Physics требуется синхронизация:
this.physics.world.timeScale = 0.5;
Если замедлить только анимацию, персонаж будет двигаться быстро, но визуально «бежать медленно», что создаёт рассинхронизацию.
Базовый алгоритм:
timeScale.Пример:
rewind() {
this.player.anims.playReverse('run');
this.player.anims.timeScale = 0.4;
this.player.setVelocityX(-200);
}
Такой подход позволяет создать кинематографичный эффект без сложной логики пересчёта кадров.
Для гибкого контроля анимаций используются:
play()playReverse()reverse()timeScaleglobalTimeScalepause() / resume()yoyoКомбинация этих механизмов формирует мощный инструментарий для реализации динамичных игровых сцен, визуальных переходов и эффектов времени в проектах на базе Phaser.