О чем этот пример
Вращение объектов — одна из базовых техник, оживляющих вашу игру. Понимание того, как управлять свойством `rotation`, открывает путь к созданию анимации вертолётов, вращающихся платформ, качающихся маятников и многого другого без использования предзаписанных анимаций. В этой статье мы разберём простой, но фундаментальный пример, который научит вас анимировать любой спрайт прямо в игровом цикле.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
image;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('logo', 'assets/sprites/phaser3-logo.png');
}
create ()
{
this.image = this.add.image(400, 300, 'logo');
}
update ()
{
this.image.rotation += 0.01;
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка и создание изображения
Весь процесс начинается с подготовки сцены. В методе preload() мы загружаем изображение, которое будем вращать. Важно использовать setBaseURL() для указания базового пути к ресурсам, чтобы не писать полные URL каждый раз.
Затем, в методе create(), мы создаём игровой объект — изображение. Метод this.add.image() принимает координаты X, Y и ключ загруженного изображения. Объект помещается в центр сцены с координатами (400, 300).
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('logo', 'assets/sprites/phaser3-logo.png');
}
create ()
{
this.image = this.add.image(400, 300, 'logo');
}
Магия в игровом цикле: метод update()
Настоящая анимация происходит в методе update(). Этот метод вызывается на каждом кадре игры (обычно 60 раз в секунду). Здесь мы напрямую изменяем свойство rotation нашего изображения, добавляя к нему небольшое значение.
Свойство rotation измеряется в радианах. Добавляя 0.01 каждый кадр, мы обеспечиваем плавное непрерывное вращение по часовой стрелке. Это и есть основа анимации в реальном времени.
update ()
{
this.image.rotation += 0.01;
}
Понимание конфигурации игры
Код вне класса сцены отвечает за настройку и запуск всего приложения Phaser. Объект config определяет основные параметры: тип рендерера, размеры холста, элемент-контейнер на странице и главную сцену.
Конструктор new Phaser.Game(config) принимает эту конфигурацию и инициализирует игровой цикл, который начинает вызывать методы preload(), create(), а затем непрерывно — update().
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Ключевые свойства и концепции
Работая с вращением, важно помнить о двух вещах:
1. **Точка вращения (origin):** По умолчанию объект вращается вокруг своего центра (origin 0.5). Это поведение можно изменить через свойство setOrigin().
2. **Углы и радианы:** В Phaser для углов используются радианы. Полный оборот равен Math.PI * 2 (примерно 6.28). Если вам привычнее градусы, можно использовать свойство angle, которое работает с градусами, но внутренне Phaser всё равно конвертирует их в радианы для rotation.
Чтобы вращать объект быстрее или медленнее, просто измените значение, на которое увеличивается rotation в update().
Что попробовать дальше
Вы освоили базовый принцип динамической анимации в Phaser 3, изменяя свойство объекта в игровом цикле. Для экспериментов попробуйте: вращать объект против часовой стрелки (вычитая значение), привязать скорость вращения к времени кадра с помощью delta, используя this.image.angle для работы в градусах, или заставить объект вращаться только при нажатии клавиши.
