TweenManager — это система управления анимациями в библиотеке Phaser, предназначенная для плавного изменения свойств игровых объектов во времени. Она позволяет анимировать позиции, размеры, прозрачность, вращение и другие свойства спрайтов и контейнеров без необходимости вручную обновлять их в каждом кадре.
В Phaser каждый объект сцены автоматически может быть анимирован через твины, которые создаются через менеджер твинов сцены:
this.tweens.add({
targets: player,
x: 400,
duration: 1000,
ease: 'Power2'
});
Ключевые параметры:
targets — объект или массив объектов, свойства которых
будут изменяться.props или прямое указание свойства (например,
x, y) — конечные значения анимации.duration — длительность твина в миллисекундах.ease — функция сглаживания изменения значения. Phaser
поддерживает большое количество кривых, включая Linear,
Power1, Power2, Bounce,
Elastic.delay — задержка перед стартом анимации.repeat — количество повторов; -1 для
бесконечного повторения.yoyo — логическое значение, указывающее, вернется ли
объект к исходной позиции после завершения твина.Для создания твина используется метод
this.tweens.add(config). Конфигурация твина может быть
простой или сложной. Простая конфигурация включает прямое изменение
одного свойства, например позиции:
this.tweens.add({
targets: enemy,
y: 300,
duration: 2000,
ease: 'Linear'
});
Для более сложных анимаций можно одновременно изменять несколько свойств:
this.tweens.add({
targets: star,
x: 500,
y: 200,
alpha: 0.5,
scaleX: 2,
scaleY: 2,
duration: 1500,
ease: 'Power3',
yoyo: true,
repeat: 2
});
Особенности многосвойственных твинов:
ease.duration и delay можно задавать
как для всего твина, так и для отдельного свойства.yoyo создаёт эффект возврата к исходным
значениям после завершения анимации.TweenManager поддерживает несколько встроенных обратных вызовов для контроля событий анимации:
onStart — вызывается при старте твина.onUpdate — вызывается на каждом кадре изменения.onComplete — вызывается при завершении твина.onRepeat — вызывается при каждом повторе твина.onYoyo — вызывается при срабатывании эффекта
yoyo.Пример с обратными вызовами:
this.tweens.add({
targets: player,
x: 600,
duration: 1000,
ease: 'Cubic.easeInOut',
yoyo: true,
repeat: 1,
onStart: () => console.log('Твин начался'),
onComplete: () => console.log('Твин завершен')
});
Для создания сложных анимаций можно использовать Timeline — последовательность твинов, управляемую единым объектом:
let timeline = this.tweens.createTimeline();
timeline.add({
targets: enemy,
x: 400,
duration: 1000,
ease: 'Power1'
});
timeline.add({
targets: enemy,
y: 300,
duration: 1000,
ease: 'Bounce.easeOut'
});
timeline.play();
Особенности Timeline:
loop, yoyo,
onComplete для всей последовательности.easeФункция ease определяет способ изменения значения от
начального к конечному. Phaser поддерживает несколько категорий
кривых:
Power1, Power2, Power3,
Power4).Каждую кривую можно комбинировать с режимами easeIn,
easeOut, easeInOut для контроля направления
ускорения.
TweenManager позволяет управлять твинами после их создания:
tween.pause() — приостановка твина.tween.resume() — продолжение приостановленного
твина.tween.stop() — немедленное завершение твина.tween.restart() — повторное воспроизведение с
начала.tween.seek(time) — установка текущего времени твина,
полезно для синхронизации анимаций.Пример управления твином:
let tween = this.tweens.add({
targets: star,
alpha: 0,
duration: 2000
});
// Через 1 секунду приостановить твин
this.time.delayedCall(1000, () => tween.pause());
Можно анимировать сразу несколько объектов, передав массив в
targets:
this.tweens.add({
targets: [player, enemy, star],
y: 500,
duration: 1500,
ease: 'Sine.easeInOut'
});
В этом случае каждый объект анимируется одновременно, но при
необходимости можно задать разные задержки через функцию
delay:
this.tweens.add({
targets: enemies.getChildren(),
x: 400,
duration: 1000,
delay: (target, key, value, index) => index * 200,
ease: 'Power2'
});
Твины могут работать не только с примитивными свойствами
(x, y, alpha), но и с вложенными
объектами, например, scale, rotation,
tекстурными координатами:
this.tweens.add({
targets: sprite,
scale: { from: 1, to: 2 },
rotation: 2 * Math.PI,
duration: 1200,
ease: 'Elastic.easeOut'
});
Такой подход позволяет создавать комплексные визуальные эффекты без необходимости вручную обновлять каждый кадр.
TweenManager в Phaser обеспечивает мощный и гибкий инструмент для управления анимацией, позволяя создавать плавные, динамичные и сложные визуальные эффекты, упрощая разработку игр и интерактивных приложений на JavaScript.