О чем этот пример
Работа с группами — ключевой навык для организации игровых объектов в Phaser. Вместо ручного создания спрайтов и последующего добавления в группу, можно делать это за один шаг. Это делает код чище и эффективнее, особенно при создании множества однотипных объектов, таких как пули, враги или частицы. В этой статье разберем, как метод `group.create()` упрощает вашу архитектуру.
Версия 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.image('phaser', 'assets/sprites/phaser2.png');
}
create ()
{
const group = this.add.group();
// Create a Sprite via the group.
// The Sprite is added to the Scene display list, and to the group, at the same time.
group.create(400, 300, 'phaser');
// The above is a short-cut for:
// var sprite = this.add.sprite(400, 300, 'phaser');
// group.add(sprite);
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что такое группа (Group)?
Группа (Phaser.GameObjects.Group) — это контейнер для управления коллекцией игровых объектов. Она позволяет обновлять, фильтровать и уничтожать объекты как единое целое, что особенно полезно для пуль, врагов или блоков на уровне.
Ключевое преимущество групп — производительность. Phaser оптимизирует обработку объектов внутри группы, что критично для игр с большим количеством динамических элементов.
Создание группы и спрайта
В методе create() сцены мы сначала создаем пустую группу с помощью this.add.group(). Затем используем метод create() самой группы для добавления спрайта.
const group = this.add.group();
group.create(400, 300, 'phaser');
Этот код создает спрайт с ключом текстуры 'phaser' на координатах (400, 300) и сразу добавляет его в группу group. Объект также автоматически помещается в список отображения сцены, поэтому он будет виден на экране.
Сравнение с ручным подходом
Метод group.create() — это сокращенная запись для более многословного, но функционально идентичного подхода. Давайте сравним его с классическим способом.
// Сокращенный способ через группу
group.create(400, 300, 'phaser');
// Развернутый (ручной) способ
const sprite = this.add.sprite(400, 300, 'phaser');
group.add(sprite);
Оба варианта дают одинаковый результат. Однако использование group.create() делает намерения разработчика более явными и сокращает количество строк кода, что повышает читаемость.
Практическое применение и паттерны
Основная сила метода group.create() раскрывается при массовом создании объектов, например, в цикле для генерации поля из плиток или волны врагов.
// Создание сетки из спрайтов
for (let y = 0; y < 5; y++)
{
for (let x = 0; x < 5; x++)
{
group.create(100 + x * 100, 100 + y * 100, 'phaser');
}
}
Все созданные спрайты будут частью одной группы. Это позволяет, например, одним вызовом group.clear(true, true) удалить все спрайты и освободить память, или использовать group.children.iterate для применения логики ко всем объектам.
Что попробовать дальше
Использование group.create() — это простой, но мощный паттерн для структурирования игрового кода. Он уменьшает сложность и помогает управлять объектами как единым целым. Попробуйте экспериментировать: создайте группу для пуль и используйте create внутри обработчика выстрела, или сгенерируйте процедурный уровень, заполняя группу плитками. Это отличный шаг к написанию чистого и эффективного кода на Phaser.
