Анимация в Phaser строится на последовательной смене кадров. В роли кадров могут выступать:
Создание анимации из разных текстур особенно актуально, когда графика
хранится в виде отдельных файлов: run1.png,
run2.png, run3.png и т.д. Такой подход часто
используется на ранних этапах разработки или при ручной подготовке
графики без упаковки в атлас.
Phaser позволяет объединить такие текстуры в единую анимацию через
менеджер анимаций this.anims.
Перед созданием анимации необходимо загрузить каждую текстуру в
сцене. Загрузка выполняется в методе preload().
preload() {
this.load.image('run1', 'assets/run1.png');
this.load.image('run2', 'assets/run2.png');
this.load.image('run3', 'assets/run3.png');
this.load.image('run4', 'assets/run4.png');
}
Каждой текстуре присваивается уникальный ключ. Именно эти ключи используются при формировании кадров анимации.
Анимация создаётся в методе create() с помощью
this.anims.create().
create() {
this.anims.create({
key: 'run',
frames: [
{ key: 'run1' },
{ key: 'run2' },
{ key: 'run3' },
{ key: 'run4' }
],
frameRate: 10,
repeat: -1
});
}
key — уникальное имя анимации.
frames — массив кадров.
frameRate — количество кадров в секунду.
repeat:
-1 — бесконечное повторение,0 — проигрывание один раз,n — повтор n раз.Каждый кадр задаётся объектом
{ key: 'имя_текстуры' }.
После объявления анимации создаётся игровой объект, чаще всего спрайт:
create() {
this.player = this.add.sprite(400, 300, 'run1');
this.player.play('run');
}
В конструкторе спрайта указывается первая текстура, которая будет
отображаться до запуска анимации. Метод play() запускает
анимацию по её ключу.
Все текстуры в анимации должны:
Если размеры различаются, объект будет визуально «прыгать» при смене кадров.
Выравнивание можно задать через:
this.player.setOrigin(0.5, 0.5);
Скорость регулируется двумя способами:
frameRateframeRate: 12
durationВместо frameRate можно указать общую длительность в
миллисекундах:
this.anims.create({
key: 'run',
frames: [...],
duration: 800,
repeat: -1
});
Phaser автоматически рассчитает частоту смены кадров.
this.player.stop();
this.player.anims.pause();
this.player.anims.resume();
if (this.player.anims.isPlaying) {
// анимация воспроизводится
}
Если текстуры имеют систематические имена (run1,
run2, run3…), массив кадров можно сформировать
программно:
create() {
const frames = [];
for (let i = 1; i <= 4; i++) {
frames.push({ key: 'run' + i });
}
this.anims.create({
key: 'run',
frames: frames,
frameRate: 10,
repeat: -1
});
}
Подход удобен при большом количестве кадров.
Менеджер анимаций в Phaser глобальный для всей игры. Если анимация создаётся в одной сцене, она доступна в других сценах.
Проверка существования анимации:
if (!this.anims.exists('run')) {
this.anims.create({...});
}
Это предотвращает ошибку повторного создания.
Для однократных анимаций часто требуется выполнить действие после завершения.
this.player.on('animationcomplete', (animation) => {
if (animation.key === 'run') {
console.log('Анимация завершена');
}
});
Можно также подписаться на конкретную анимацию:
this.player.on('animationcomplete-run', () => {
console.log('Run завершена');
});
Возможна ситуация, когда анимация должна использовать текстуры из разных логических групп:
this.anims.create({
key: 'combo',
frames: [
{ key: 'attack1' },
{ key: 'attack2' },
{ key: 'effect1' },
{ key: 'effect2' }
],
frameRate: 15,
repeat: 0
});
Phaser не ограничивает использование кадров одной текстурой — можно комбинировать любые заранее загруженные изображения.
Создание анимации из отдельных текстур удобно, но имеет ограничения:
В производственных проектах рекомендуется использовать:
Тем не менее, для прототипов и небольших игр анимация из отдельных изображений полностью оправдана.
Для тонкой настройки можно задать индивидуальную длительность кадра:
this.anims.create({
key: 'run',
frames: [
{ key: 'run1', duration: 100 },
{ key: 'run2', duration: 200 },
{ key: 'run3', duration: 100 },
{ key: 'run4', duration: 150 }
],
repeat: -1
});
Это позволяет создавать нестандартный ритм движения.
Часто персонаж имеет несколько анимаций:
this.anims.create({ key: 'idle', frames: [...] });
this.anims.create({ key: 'run', frames: [...] });
this.anims.create({ key: 'jump', frames: [...] });
Переключение выполняется в методе update():
if (cursors.left.isDown) {
this.player.play('run', true);
} else {
this.player.play('idle', true);
}
Второй параметр true предотвращает перезапуск анимации,
если она уже воспроизводится.
Наиболее распространённые проблемы:
Phaser выводит предупреждения в консоль, что облегчает диагностику.
this.player.playReverse('run');
this.player.anims.play('run', true, 2);
this.player.anims.timeScale = 2;
Значение 1 — нормальная скорость, 2 — в два
раза быстрее, 0.5 — в два раза медленнее.
Создание анимации из разных текстур в Phaser представляет собой гибкий механизм управления последовательной сменой изображений. Несмотря на простоту реализации, он предоставляет полный контроль над кадрами, их длительностью, скоростью и логикой воспроизведения, что делает его эффективным инструментом при разработке 2D-игр различной сложности.