Воспроизведение анимации: play, resume, pause, stop

Phaser предоставляет мощный модуль для работы с анимацией спрайтов, позволяя управлять их воспроизведением через методы play, resume, pause и stop. Анимации создаются с помощью this.anims.create и присваиваются объектам спрайтов. Каждый спрайт может воспроизводить одну или несколько анимаций, управляемых через ключи анимации.

this.anims.create({
    key: 'run',
    frames: this.anims.generateFrameNumbers('player', { start: 0, end: 5 }),
    frameRate: 10,
    repeat: -1
});

let player = this.add.sprite(100, 100, 'player');
player.play('run');

Метод play

Метод play запускает анимацию на спрайте. В качестве параметра передается ключ анимации, определенный при создании. Дополнительно можно передать объект с опциями:

  • ignoreIfPlaying – если true, анимация не будет перезапущена, если уже воспроизводится.
  • startFrame – номер кадра, с которого начнется воспроизведение.
player.play('run', true); // true как параметр ignoreIfPlaying
player.play({ key: 'run', startFrame: 2 });

При использовании play повторная попытка запуска той же анимации по умолчанию перезапускает её с первого кадра, если ignoreIfPlaying не указан.

Метод pause

Метод pause приостанавливает воспроизведение текущей анимации, сохраняя текущее состояние. Можно указать конкретный кадр, на котором должна остановиться анимация.

player.anims.pause(); // пауза на текущем кадре
player.anims.pause(player.anims.currentFrame); // явная фиксация на текущем кадре

Приостановленная анимация сохраняет все настройки: скорость, повтор и текущее положение. Это позволяет затем корректно продолжить воспроизведение.

Метод resume

Метод resume возобновляет ранее приостановленную анимацию. Используется в сочетании с pause для временной остановки действий персонажа или визуальных эффектов.

player.anims.resume();

Если анимация не была приостановлена, вызов resume просто проигнорирует действие, не вызывая ошибок.

Метод stop

Метод stop полностью останавливает анимацию и сбрасывает её состояние. После вызова stop анимацию можно запускать снова с помощью play, но она начнется с первого кадра.

player.anims.stop();

Метод stop также принимает объект с опциями:

  • resetFrame – если true, спрайт вернется к первому кадру анимации или к исходному кадру текстуры.
player.anims.stop(true); // сброс к исходному кадру

Комбинирование методов для управления анимацией

Частой задачей является управление анимацией в зависимости от состояния игры. Например, можно приостановить анимацию при паузе игры, затем возобновить её после возобновления.

function togglePauseAnimation(sprite, isPaused) {
    if (isPaused) {
        sprite.anims.pause();
    } else {
        sprite.anims.resume();
    }
}

Другой пример — смена анимации при смене действия персонажа с автоматическим перезапуском:

if (player.body.velocity.x !== 0) {
    player.play({ key: 'run', ignoreIfPlaying: true });
} else {
    player.play('idle', true);
}

Настройка плавного управления анимацией

Phaser позволяет контролировать скорость и направление воспроизведения. Использование методов setTimeScale и setReverse изменяет поведение текущей анимации без необходимости пересоздавать её.

player.anims.currentAnim.setTimeScale(1.5); // ускорение в 1.5 раза
player.anims.currentAnim.setReverse(true);  // воспроизведение в обратном порядке

Эти методы особенно полезны для создания динамичных визуальных эффектов, таких как ускорение движения персонажа или эффект замедления при столкновениях.

События анимации

Phaser предоставляет события для отслеживания состояний анимации:

  • animationstart – срабатывает при начале воспроизведения.
  • animationcomplete – срабатывает при завершении анимации.
  • animationpause – срабатывает при приостановке.
  • animationresume – срабатывает при возобновлении.
  • animationstop – срабатывает при полном останове.
player.on('animationcomplete', () => {
    console.log('Анимация завершена');
});
player.on('animationpause', () => {
    console.log('Анимация приостановлена');
});

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

Практические рекомендации

  • Для спрайтов с повторяющимися анимациями использовать repeat: -1.
  • Для редких анимаций (атака, прыжок) не использовать repeat, чтобы анимация автоматически завершалась.
  • Методы pause и resume эффективны для управления временными остановками игры без потери состояния спрайта.
  • stop применять, когда требуется полностью сбросить состояние и подготовить спрайт к новой анимации.

Гибкое использование play, pause, resume и stop позволяет создавать реалистичные и отзывчивые игровые сцены, обеспечивая полное управление визуальными эффектами спрайтов.