О чем этот пример
Визуальные эффекты и геометрические построения — важная часть игровой разработки. Этот пример демонстрирует, как, используя простые методы геометрического модуля Phaser, можно создавать сложные и привлекательные паттерны. Вы научитесь работать с прямоугольниками, получать их стороны в виде линий и динамически строить графику, что пригодится для создания фонов, интерфейсов или спецэффектов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
const rect = new Phaser.Geom.Rectangle(0, 0, 800, 600);
const graphics = this.add.graphics({ lineStyle: { width: 2, color: 0x0000aa } });
let count = 0;
const lines = [];
while (rect.height > 5)
{
switch (count++ % 4)
{
case 0:
lines.push(rect.getLineA());
break;
case 1:
lines.push(rect.getLineB());
break;
case 2:
lines.push(rect.getLineC());
break;
case 3:
lines.push(rect.getLineD());
break;
}
rect.width *= 0.95;
rect.height *= 0.95;
rect.centerX = 400;
rect.centerY = 300;
}
for (let i = 0; i < lines.length - 1; i++)
{
const firstLine = lines[i];
const secondLine = lines[i + 1];
graphics.lineBetween(firstLine.x1, firstLine.y1, secondLine.x1, secondLine.y1);
graphics.lineBetween(firstLine.x2, firstLine.y2, secondLine.x2, secondLine.y2);
}
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание основы: прямоугольник и графика
Всё начинается с создания прямоугольника и объекта для рисования. Прямоугольник задаёт исходную область, а объект Graphics позволяет визуализировать линии.
const rect = new Phaser.Geom.Rectangle(0, 0, 800, 600);
const graphics = this.add.graphics({ lineStyle: { width: 2, color: 0x0000aa } });
Прямоугольник rect инициализируется в точке (0,0) с шириной 800 и высотой 600 пикселей, что соответствует размерам сцены из конфигурации. Объект graphics настраивается на рисование синих линий толщиной 2 пикселя.
Извлечение линий и трансформация прямоугольника
Ключевая часть алгоритма — циклическое получение сторон прямоугольника и его постепенное уменьшение. Каждая сторона возвращается как объект линии с координатами начала (x1, y1) и конца (x2, y2).
switch (count++ % 4)
{
case 0:
lines.push(rect.getLineA());
break;
case 1:
lines.push(rect.getLineB());
break;
case 2:
lines.push(rect.getLineC());
break;
case 3:
lines.push(rect.getLineD());
break;
}
rect.width *= 0.95;
rect.height *= 0.95;
rect.centerX = 400;
rect.centerY = 300;
Методы getLineA(), getLineB(), getLineC() и getLineD() последовательно возвращают верхнюю, правую, нижнюю и левую стороны прямоугольника. После получения линии прямоугольник уменьшается на 5% (* 0.95), а его центр сбрасывается в середину экрана, создавая эффект вложенных прямоугольников. Цикл выполняется, пока высота не станет меньше 5 пикселей.
Визуализация узора: соединение линий
Собранный массив линий используется для рисования узора. Алгоритм последовательно соединяет соответствующие точки соседних линий.
for (let i = 0; i < lines.length - 1; i++)
{
const firstLine = lines[i];
const secondLine = lines[i + 1];
graphics.lineBetween(firstLine.x1, firstLine.y1, secondLine.x1, secondLine.y1);
graphics.lineBetween(firstLine.x2, firstLine.y2, secondLine.x2, secondLine.y2);
}
Метод graphics.lineBetween() рисует отрезок между двумя точками. Код соединяет начальные (x1, y1) и конечные (x2, y2) точки каждой линии с аналогичными точками следующей линии в массиве. Это создаёт характерный "скручивающийся" паттерн, так как линии принадлежат уменьшающимся и смещающимся прямоугольникам.
Что попробовать дальше
Вы освоили мощный приём для генерации геометрического искусства, используя всего несколько вызовов API Phaser. Экспериментируйте: измените коэффициент уменьшения прямоугольника, цвет и толщину линий, порядок извлечения сторон или попробуйте соединять не соседние, а случайные линии из массива для создания более абстрактных визуальных эффектов.
