Статические группы объектов (Static Group) в Phaser
предназначены для хранения и управления наборами объектов, которые не
изменяют своего положения и физического состояния после создания. Они
обеспечивают оптимизацию производительности, поскольку физический движок
не отслеживает динамические свойства этих объектов. Статические группы
особенно полезны для платформ, стен, барьеров и других элементов уровня,
которые остаются неизменными в процессе игры.
Для создания статической группы используется метод
this.physics.add.staticGroup() в сцене:
const platforms = this.physics.add.staticGroup();
После создания группы объекты можно добавлять двумя способами:
напрямую через метод create или через метод
add, используя уже существующие объекты.
// Создание нового объекта в группе
platforms.create(400, 568, 'ground').setScale(2).refreshBody();
// Добавление уже существующего объекта
const wall = this.add.sprite(200, 300, 'wall');
platforms.add(wall);
Важно: при использовании метода create
автоматически создается объект с физическим телом, подходящим для
статической группы. После масштабирования объекта необходимо вызвать
refreshBody(), чтобы физическое тело обновилось и
соответствовало новым размерам.
Статические группы наследуют функциональность
Phaser.GameObjects.Group, но с ограничениями физики:
children — коллекция всех объектов группы. Позволяет
итерироваться по элементам.get(x, y, key) — возвращает объект с указанными
координатами или создает новый, если он отсутствует.create(x, y, key) — создает объект с физическим телом и
добавляет его в группу.add(gameObject) — добавляет существующий объект в
группу.refresh() и refreshBody() — обновляют
физические тела после изменения размеров или позиции объектов.Динамические группы (Group) предназначены для объектов,
которые могут перемещаться, сталкиваться и изменять свойства во время
игры. Статические группы:
setVelocity, которые
игнорируются).Для обработки столкновений статические группы используют метод
this.physics.add.collider:
this.physics.add.collider(player, platforms);
В данном примере player — динамический объект, а
platforms — статическая группа. Физический движок корректно
вычисляет коллизии, останавливая игрока на платформах. Если в группе
несколько объектов, столкновение проверяется с каждым элементом, но
благодаря оптимизации движка это не снижает производительность
значимо.
Статические группы удобно использовать для создания уровней из тайлов или объектов, загруженных через Tiled:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tileset', 'tiles');
const groundLayer = map.createLayer('Ground', tileset);
const groundObjects = this.physics.add.staticGroup();
groundLayer.forEachTile(tile => {
if (tile.index !== -1) {
groundObjects.create(tile.getCenterX(), tile.getCenterY(), 'ground').setOrigin(0.5, 0.5).refreshBody();
}
});
Такой подход позволяет динамически создавать физические объекты на основе тайлов, сохраняя преимущества статических групп для производительности.
Статические группы поддерживают массовые изменения свойств объектов
через методы set*. Примеры:
platforms.setVisible(false); // Скрыть все объекты
platforms.setAlpha(0.5); // Установить прозрачность
platforms.setTint(0xff0000); // Задать цветовой оттенок
Методы применяются ко всем детям группы, что облегчает визуальное оформление и управление объектами уровня.
refreshBody(), иначе столкновения будут работать
некорректно.Статические группы являются ключевым инструментом для оптимизации и организации уровней в Phaser, позволяя эффективно управлять неподвижными объектами и обеспечивать корректные столкновения без лишней нагрузки на физический движок.