О чем этот пример

При создании игр часто возникает задача расположить группу объектов, например, бонусов или врагов, по заданной геометрической форме. Вручную рассчитывать координаты для каждого спрайта — утомительно и подвержено ошибкам. Phaser предоставляет мощный набор действий (`Actions`), которые позволяют управлять группами объектов одним вызовом. В этой статье мы разберем, как быстро и равномерно разместить группу спрайтов по периметру прямоугольника, используя `Phaser.Actions.PlaceOnRectangle`. Это отличный способ создавать сложные формации с минимальным кодом.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('ball', 'assets/sprites/shinyball.png');
    }

    create ()
    {
        const rect = new Phaser.Geom.Rectangle(100, 100, 256, 256);

        const group = this.add.group({ key: 'ball', frameQuantity: 32 });

        Phaser.Actions.PlaceOnRectangle(group.getChildren(), rect);
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Подготовка сцены и загрузка ресурсов

Как и в любом проекте на Phaser, мы начинаем с создания класса сцены. В методе preload загружается необходимый спрайт.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('ball', 'assets/sprites/shinyball.png');
}

Здесь setBaseURL задает базовый путь для загрузки, что удобно, если все ресурсы хранятся в одном месте. Метод load.image регистрирует текстуру под ключом 'ball' для последующего создания спрайтов.

Создание геометрической области и группы спрайтов

Вся логика размещения происходит в методе create. Сначала мы определяем прямоугольную область, внутри которой (точнее, по контуру которой) будут размещены объекты.

const rect = new Phaser.Geom.Rectangle(100, 100, 256, 256);

Конструктор Phaser.Geom.Rectangle принимает координаты верхнего левого угла (x, y), ширину и высоту. Наш прямоугольник будет расположен в точке (100, 100) и иметь размер 256x256 пикселя.

Далее создается группа (Group) спрайтов. Группы в Phaser — это удобный способ управлять множеством однотипных объектов.

const group = this.add.group({ key: 'ball', frameQuantity: 32 });

При создании группы мы передаем конфигурационный объект. Параметр key указывает на ключ загруженного ранее изображения ('ball'). Параметр frameQuantity задает количество создаваемых спрайтов — в нашем случае 32. Все спрайты создаются сразу, но их позиции по умолчанию равны (0, 0).

Магия метода PlaceOnRectangle

Теперь самое интересное — распределение всех спрайтов группы по контуру прямоугольника. Для этого используется статический метод Phaser.Actions.PlaceOnRectangle.

Phaser.Actions.PlaceOnRectangle(group.getChildren(), rect);

Этот метод принимает два аргумента: 1. Массив объектов для размещения. Мы получаем его, вызвав group.getChildren(). 2. Объект прямоугольника (rect), созданный нами ранее.

Метод автоматически и равномерно расставляет все объекты из массива по периметру заданного прямоугольника. Первый объект будет размещен в верхнем левом углу, а остальные — последовательно по часовой стрелке. Вам не нужно вручную вычислять координаты для каждого шарика — Phaser делает это за вас.

Настройка и запуск игры

Финальный шаг — конфигурация и инстанцирование самого игрового объекта Phaser.Game.

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

В объекте конфигурации задаются основные параметры: type рендерера, размеры холста (width, height), цвет фона (backgroundColor), ID HTML-элемента для встраивания (parent) и класс основной сцены (scene). После создания экземпляра игры Phaser автоматически запускает жизненный цикл сцены (preload, create, update).

Что попробовать дальше

Метод Phaser.Actions.PlaceOnRectangle — это мощный и лаконичный инструмент для автоматического расположения объектов по контуру прямоугольника. Он идеально подходит для создания круговой обороны, границ уровня, спецэффектов или любых других сцен, требующих точного геометрического размещения. **Идеи для экспериментов:** * Попробуйте использовать другие геометрические фигуры из модуля Phaser.Geom, например, Circle или Triangle. Для них существуют аналогичные методы PlaceOnCircle и PlaceOnTriangle. * Скомбинируйте действие PlaceOnRectangle с другими действиями из Phaser.Actions, например, RandomEllipse для более органичного, "разбросанного" размещения. * Анимируйте получившийся круг шариков, применив к группе действие RotateAround для вращения вокруг центра сцены.