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

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

Версия 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.spritesheet('diamonds', 'assets/sprites/diamonds32x24x5.png', { frameWidth: 32, frameHeight: 24 });
    }

    create ()
    {
        //  Create 5 sprites in our group (one per frame)

        //  Use the setXY object to set the positions on them all to be 100 x 100 + 64px spacing (the stepX/Y values)

        const group = this.add.group({
            key: 'diamonds',
            frame: [ 0, 1, 2, 3, 4 ],
            setXY:
            {
                x: 100,
                y: 100,
                stepX: 64,
                stepY: 64
            }
        });
    }
}

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

const game = new Phaser.Game(config);

Что такое группа (Group) и зачем она нужна?

В Phaser Group — это контейнер для управления коллекцией игровых объектов (спрайтов, изображений, текста). Она позволяет обращаться ко всем объектам как к единому целому: обновлять их свойства, применять физику, фильтры или, как в нашем примере, задавать позиции.

Основные преимущества использования групп: * **Упрощение управления:** Вместо отслеживания множества отдельных переменных, вы работаете с одной группой. * **Автоматическое создание:** Группа может сама создавать заданное количество объектов по предоставленному шаблону (ключу key). * **Эффективное позиционирование:** Встроенные методы, такие как setXY, избавляют от необходимости писать циклы для расстановки объектов.

Разбираем конфигурацию группы: ключ, кадры и `setXY`

Давайте детально рассмотрим объект конфигурации, который передается в метод this.add.group().

const group = this.add.group({
    key: 'diamonds',
    frame: [ 0, 1, 2, 3, 4 ],
    setXY: {
        x: 100,
        y: 100,
        stepX: 64,
        stepY: 64
    }
});

* key: 'diamonds': Указывает на ключ спрайтшита, загруженного в preload. Группа будет использовать его для создания своих спрайтов. * frame: [ 0, 1, 2, 3, 4 ]: Это массив индексов кадров (frames) внутри спрайтшита. Группа создаст 5 спрайтов, и каждый получит свой уникальный кадр из этого списка. Если бы мы указали frame: 0, все спрайты выглядели бы одинаково. * setXY: Это опциональный, но крайне полезный конфиг для автоматического позиционирования. Он содержит: * x: 100, y: 100 — координаты (X, Y) для *первого* спрайта в группе. * stepX: 64, stepY: 64 — шаг (отступ) по осям X и Y для каждого последующего спрайта.

Как работает алгоритм расстановки `setXY`?

Функция setXY применяется ко всем спрайтам в группе последовательно, согласно порядку в массиве frame.

**Алгоритм для нашего примера:** 1. Первый спрайт (frame 0) помещается в точку (100, 100). 2. Координата X для второго спрайта (frame 1) вычисляется как x + stepX (100 + 64 = 164). Координата Y также увеличивается на stepY (100 + 64 = 164). Итоговая позиция — (164, 164). 3. Третий спрайт (frame 2) получает координаты (164 + 64 = 228, 164 + 64 = 228). 4. И так далее для всех пяти спрайтов.

В результате спрайты выстраиваются по диагонали. Если бы мы задали stepY: 0, они выстроились бы в горизонтальный ряд. stepX: 0 создал бы вертикальную колонку.

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

Использование Group с конфигурацией setXY — это элегантный и производительный способ массового создания и упорядочивания игровых объектов. Вы можете экспериментировать: создайте сетку 5x5, используя вложенный цикл для формирования массива кадров и настраивая stepX и stepY. Попробуйте применить setXY к уже существующей группе, вызвав group.setXY(100, 100, 64, 64). Это открывает простор для генерации уровней, инвентаря или любых повторяющихся элементов игры.