AnimationManager: глобальный реестр анимаций

В библиотеке Phaser управление анимациями организовано через объект AnimationManager, который служит глобальным хранилищем всех анимаций, доступных в игре. Он позволяет создавать, хранить, воспроизводить и управлять анимациями для спрайтов и других игровых объектов.


Основные функции AnimationManager

  1. Регистрация анимаций Анимации регистрируются глобально и могут использоваться любым спрайтом, что позволяет не дублировать один и тот же набор кадров.

    this.anims.create({
        key: 'walk',
        frames: this.anims.generateFrameNumbers('player', { start: 0, end: 9 }),
        frameRate: 10,
        repeat: -1
    });
    • key — уникальный идентификатор анимации.
    • frames — набор кадров для воспроизведения.
    • frameRate — скорость анимации в кадрах в секунду.
    • repeat — количество повторов; -1 означает бесконечное воспроизведение.
  2. Генерация кадров generateFrameNumbers и generateFrameNames позволяют автоматически формировать массив кадров из спрайтшитов или атласов.

    const frames = this.anims.generateFrameNames('enemyAtlas', {
        prefix: 'enemy_',
        start: 1,
        end: 4,
        zeroPad: 2
    });
  3. Воспроизведение анимаций на спрайте Любой спрайт может запускать анимацию, зарегистрированную в AnimationManager, используя метод play.

    player.play('walk');

    Если анимация уже воспроизводится, можно использовать опцию ignoreIfPlaying, чтобы не перезапускать её:

    player.play({ key: 'walk', ignoreIfPlaying: true });
  4. События анимаций Phaser позволяет отслеживать жизненный цикл анимаций через события:

    • animationstart — запуск анимации.
    • animationupdate — изменение кадра.
    • animationcomplete — завершение воспроизведения.
    • animationrepeat — повтор анимации.

    Пример привязки событий:

    player.on('animationcomplete', (animation, frame) => {
        console.log(`Анимация ${animation.key} завершена`);
    });

Методы управления анимациями

  • get(key) — возвращает объект анимации по ключу.

    const walkAnim = this.anims.get('walk');
  • exists(key) — проверяет, зарегистрирована ли анимация.

  • remove(key) — удаляет анимацию из глобального реестра.

  • fromJSON(json) и toJSON() — импорт и экспорт анимаций в формате JSON, удобный для сохранения конфигурации или использования внешних редакторов.


Настройка циклов и скорости

  • frameRate управляет количеством кадров в секунду.
  • duration позволяет задавать продолжительность анимации в миллисекундах, альтернативно frameRate.
  • repeat и repeatDelay регулируют повторения и задержку между ними.
  • yoyo заставляет анимацию воспроизводиться в обратном порядке после достижения конца.
this.anims.create({
    key: 'jump',
    frames: this.anims.generateFrameNumbers('player', { start: 10, end: 15 }),
    frameRate: 12,
    repeat: 0,
    yoyo: true
});

Использование глобальных анимаций

AnimationManager позволяет повторно использовать одну и ту же анимацию на нескольких спрайтах, что экономит память и упрощает управление:

const enemies = this.add.group();

for (let i = 0; i < 5; i++) {
    const enemy = enemies.create(100 * i, 200, 'enemy');
    enemy.play('walk');
}

Каждый спрайт воспроизводит одну и ту же анимацию, зарегистрированную в AnimationManager, без создания новых объектов кадров.


Анимации из спрайтшитов и атласов

  • Sprite Sheet — упрощенный способ создавать анимацию из последовательности кадров одинакового размера.
  • Texture Atlas — более гибкий метод, где кадры могут иметь разные размеры и имена.

Пример использования атласа:

this.anims.create({
    key: 'attack',
    frames: this.anims.generateFrameNames('characterAtlas', {
        prefix: 'attack_',
        start: 1,
        end: 5,
        zeroPad: 2
    }),
    frameRate: 15
});

Анимации и физика

Анимации интегрируются с физическими объектами Phaser, позволяя синхронизировать визуальные эффекты и движение. Например, при изменении состояния спрайта:

if (player.body.velocity.y > 0) {
    player.play('fall', true);
} else if (player.body.velocity.x !== 0) {
    player.play('run', true);
} else {
    player.play('idle', true);
}

Опция true в методе play означает, что анимация будет принудительно переключена на указанную, если уже воспроизводится другая.


Анимации и тайминги

Phaser поддерживает точное управление временем:

  • delay — задержка перед запуском.
  • frame-specific duration — можно задавать продолжительность для каждого кадра индивидуально.
this.anims.create({
    key: 'blink',
    frames: this.anims.generateFrameNumbers('player', { start: 20, end: 22 }),
    frameRate: 5,
    repeat: -1,
    repeatDelay: 500
});

Советы по оптимизации

  • Использовать глобальные анимации вместо создания локальных экземпляров для каждого спрайта.
  • Минимизировать количество кадров в анимации, чтобы снизить нагрузку на рендеринг.
  • Экспортировать анимации в JSON для загрузки при старте сцены, что ускоряет инициализацию.
  • Применять события анимаций для синхронизации со звуком и игровыми эффектами.

AnimationManager является ключевым инструментом Phaser для работы с анимацией, обеспечивая единое управление кадрами, повторениями, событиями и синхронизацией с игровыми объектами, что делает анимации гибкими и эффективными.