В библиотеке Phaser для эффективного управления множеством игровых
объектов используются группы объектов. Они
предоставляют удобный способ объединения, организации и массового
контроля элементов сцены. Основные инструменты для работы с группами —
это Group и
GameObjectFactory, позволяющие создавать,
обновлять и управлять объектами с минимальным количеством кода.
Phaser.GameObjects.GroupGroup — это контейнер для множества
игровых объектов одного типа или разных типов, предоставляющий методы
для их управления. Группы не рендерятся сами по себе, но позволяют:
Группа создается через сцену:
const bullets = this.add.group();
В качестве параметров можно передавать объект с настройками:
const enemies = this.add.group({
key: 'enemySprite', // ключ текстуры
repeat: 5, // количество повторов
setXY: { x: 100, y: 100, stepX: 50 } // позиционирование
});
key — имя текстуры для объектов
группы.repeat — сколько дополнительных
экземпляров создать (первый создается автоматически).setXY — начальная позиция и шаг
смещения для последующих объектов.Groupadd(child) — добавляет объект в
группу.remove(child, removeFromScene = false)
— удаляет объект; опционально удаляет его из сцены.getChildren() — возвращает массив всех
объектов группы.getFirstDead() — возвращает первый
«мертвый» объект (для object pooling).killAll() — помечает все объекты как
неактивные.setAll(property, value) —
устанавливает указанное свойство для всех объектов группы.Пример массового изменения свойств:
enemies.setAll('velocityX', 100);
enemies.setAll('active', true);
GroupObject 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);
});
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 создают мощный и гибкий инструментарий для:
Эффективное использование этих инструментов позволяет строить масштабируемую игровую логику без дублирования кода и с высокой производительностью сцены.