Группы объектов: Group и GameObjectFactory

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


Класс Phaser.GameObjects.Group

Group — это контейнер для множества игровых объектов одного типа или разных типов, предоставляющий методы для их управления. Группы не рендерятся сами по себе, но позволяют:

  • добавлять и удалять объекты;
  • применять одинаковые свойства ко всем объектам;
  • производить массовое обновление или проверку состояния;
  • оптимизировать производительность через object pooling.

Создание группы

Группа создается через сцену:

const bullets = this.add.group();

В качестве параметров можно передавать объект с настройками:

const enemies = this.add.group({
    key: 'enemySprite', // ключ текстуры
    repeat: 5,           // количество повторов
    setXY: { x: 100, y: 100, stepX: 50 } // позиционирование
});
  • key — имя текстуры для объектов группы.
  • repeat — сколько дополнительных экземпляров создать (первый создается автоматически).
  • setXY — начальная позиция и шаг смещения для последующих объектов.

Основные методы Group

  1. add(child) — добавляет объект в группу.
  2. remove(child, removeFromScene = false) — удаляет объект; опционально удаляет его из сцены.
  3. getChildren() — возвращает массив всех объектов группы.
  4. getFirstDead() — возвращает первый «мертвый» объект (для object pooling).
  5. killAll() — помечает все объекты как неактивные.
  6. setAll(property, value) — устанавливает указанное свойство для всех объектов группы.

Пример массового изменения свойств:

enemies.setAll('velocityX', 100);
enemies.setAll('active', true);

Object Pooling с помощью Group

Object Pooling — важная техника для оптимизации производительности, когда создается много однотипных объектов (например, пули, враги, эффекты). Вместо постоянного создания и уничтожения объектов используется повторное использование.

Пример реализации пули через пул:

const bullets = this.add.group({
    maxSize: 20 // максимальное количество объектов в пуле
});

function shootBullet(x, y) {
    let bullet = bullets.getFirstDead();
    if (!bullet) return; // все пули активны

    bullet.enableBody(true, x, y, true, true);
    bullet.setVelocityY(-300);
}
  • enableBody() — активирует объект, помещая его обратно в сцену.
  • Объекты, вышедшие за пределы экрана, можно деактивировать и возвращать в пул:
bullet.on('update', () => {
    if (bullet.y < 0) bullet.setActive(false).setVisible(false);
});

GameObjectFactory (this.add)

GameObjectFactory — это фабрика для создания объектов сцены. Она интегрирована в сцену через this.add и позволяет одновременно добавлять объекты в сцену и, при необходимости, в группу.

Пример создания объекта с добавлением в группу:

const bullets = this.add.group();
const bullet = this.add.sprite(100, 200, 'bullet');
bullets.add(bullet);

Фабрика предоставляет множество методов для разных типов объектов:

  • this.add.sprite(x, y, key) — спрайт.
  • this.add.image(x, y, key) — статичное изображение.
  • this.add.text(x, y, string, style) — текст.
  • this.add.rectangle(x, y, width, height, color) — простые геометрические фигуры.

Использование фабрики совместно с группами позволяет сразу создавать объекты в рамках управления пулом и массовых операций.


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

При создании объектов через GameObjectFactory их можно сразу конфигурировать для группы:

const enemies = this.add.group({
    runChildUpdate: true // вызывает update() для каждого объекта группы автоматически
});

for (let i = 0; i < 5; i++) {
    const enemy = this.add.sprite(100 + i * 60, 200, 'enemy');
    enemies.add(enemy);
}
  • runChildUpdate: true — автоматически вызывает метод update всех объектов группы при обновлении сцены.
  • Это упрощает управление поведением множества динамических объектов, например врагов или пуль.

Итоговое использование

Группы объектов и GameObjectFactory создают мощный и гибкий инструментарий для:

  • управления множеством однотипных объектов;
  • оптимизации производительности через object pooling;
  • упрощения массовых изменений свойств;
  • автоматического вызова методов объектов.

Эффективное использование этих инструментов позволяет строить масштабируемую игровую логику без дублирования кода и с высокой производительностью сцены.