О чем этот пример
Вращение объектов — одна из базовых операций в игровой разработке. В отличие от многих других фреймворков, где для углов используются радианы, Phaser позволяет задавать вращение в привычных градусах. Это делает код интуитивно понятнее и избавляет от необходимости постоянного пересчёта значений. В этой статье мы разберём, как работает свойство `.setAngle()` и как с его помощью быстро создать набор повёрнутых спрайтов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
this.load.image('arrow', 'assets/sprites/arrow.png');
}
create ()
{
// Angle uses degrees instead of radians
for (let a = 0; a <= 360; a += 45)
{
const frame = this.add.image(40 + a * 2, 300, 'arrow').setAngle(a);
// You can also do: frame.angle = degrees;
}
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов и базовая настройка сцены
В методе preload() загружаются необходимые изображения. Одно (grid) служит фоном для отладки, а другое (arrow) — это спрайт стрелки, который мы будем вращать.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
this.load.image('arrow', 'assets/sprites/arrow.png');
}
В методе create() инициализируется логика сцены. Здесь будет происходить создание и вращение стрелок.
Цикл создания и вращения спрайтов
Вращение выполняется с помощью метода .setAngle(). Phaser использует градусы, что упрощает задачу: полный оборот равен 360 градусам. В примере цикл создаёт несколько стрелок, каждая из которых повёрнута на свой угол.
for (let a = 0; a <= 360; a += 45)
{
const frame = this.add.image(40 + a * 2, 300, 'arrow').setAngle(a);
}
Ключевой момент: `a— это угол в градусах, который передаётся напрямую вsetAngle(a). Цикл проходит от 0 до 360 с шагом 45 градусов, создавая стрелки, повёрнутые на 0°, 45°, 90° и так далее. Координата X каждой следующей стрелки смещается (40 + a * 2`), чтобы они не накладывались друг на друга.
Альтернативный способ задания угла
Метод setAngle() — это сеттер. Существует эквивалентный способ задания угла через прямое присваивание свойству .angle. Оба способа делают одно и то же.
// Вы можете также сделать: frame.angle = degrees;
На практике выбор между setAngle() и прямым присваиванием angle — это вопрос стиля. setAngle() позволяет применять чейнинг (цепочку вызовов), что удобно при инициализации объекта. Прямое присваивание свойству может быть более наглядным при изменении угла в процессе игры, например, в методе update().
Что попробовать дальше
Использование градусов для вращения в Phaser — это маленькое, но важное удобство, которое ускоряет разработку. Свойство .setAngle() и его аналог .angle позволяют мгновенно ориентировать спрайты в пространстве. Для экспериментов попробуйте изменить шаг цикла, чтобы создать более плавный или, наоборот, более редкий набор вращений, или анимируйте угол стрелки во времени, изменяя его свойство angle внутри update().
