CameraManager и несколько камер

В Phaser объект CameraManager управляет всеми камерами сцены. Каждая сцена содержит по умолчанию одну камеру (main), но при необходимости можно создавать дополнительные камеры для разделения игрового пространства, отображения мини-карт или создания эффектов параллакса. Камеры в Phaser — это объекты класса Phaser.Cameras.Scene2D.Camera, а менеджер камер обеспечивает их координацию, обновление и рендеринг.

Ключевыми методами CameraManager являются:

  • add(x, y, width, height) — создание новой камеры с указанием позиции и размеров.
  • getCamera(key) — получение камеры по её уникальному ключу.
  • remove(camera) — удаление камеры из менеджера.
  • main — ссылка на основную камеру сцены.
  • cameras — массив всех камер сцены.

Менеджер камер автоматически обновляет все камеры при каждом кадре, вызывая их методы update и render, что позволяет изменять положение, масштаб, эффекты и фильтры камер в реальном времени.


Создание и настройка нескольких камер

Для создания дополнительной камеры используется метод add. Например:

const cam1 = this.cameras.add(0, 0, 400, 300);
const cam2 = this.cameras.add(400, 0, 400, 300);

В этом примере сцена делится на две области: левый и правый сегменты экрана. Камеры могут иметь собственные параметры:

  • scrollX, scrollY — положение камеры в мире.
  • zoom — уровень масштабирования.
  • rotation — угол поворота камеры.
  • backgroundColor — цвет фона камеры, если объекты сцены не покрывают всю область.

Дополнительно камеры поддерживают маски (setMask) и фильтры, что позволяет создавать уникальные визуальные эффекты для каждой камеры.


Слежение камеры за объектами

Камера может следовать за объектом с помощью метода:

cam1.startFollow(player);

Параметры метода startFollow:

  • lerpX, lerpY — коэффициенты плавного следования по осям X и Y (значения от 0 до 1).
  • roundPixels — округление позиции камеры для предотвращения размытия спрайтов.
  • deadzone — область вокруг объекта, при выходе за которую камера начинает двигаться.

Пример настройки deadzone:

cam1.setDeadzone(100, 50);

Камера не будет двигаться, пока игрок остаётся в пределах этой зоны, что создаёт более естественное ощущение движения.


Масштабирование и эффект параллакса

Камеры можно использовать для создания эффектов параллакса, комбинируя несколько слоёв с разными коэффициентами движения. Например:

backgroundLayer.setScrollFactor(0.5);
midgroundLayer.setScrollFactor(0.8);
foregroundLayer.setScrollFactor(1);

Если за этими слоями следит одна камера, объекты будут двигаться с разной скоростью, создавая глубину сцены.

Для изменения масштаба камеры используется метод setZoom:

cam1.setZoom(2);

Это увеличит все объекты в области камеры в два раза. Масштаб можно анимировать через tween для плавного эффекта увеличения и уменьшения.


Ограничение камеры и границы

Камеру можно ограничить границами мира с помощью setBounds:

cam1.setBounds(0, 0, worldWidth, worldHeight);

Это предотвращает выход камеры за пределы игрового мира. Для нескольких камер можно задавать индивидуальные границы, позволяя, например, мини-карте следовать за игроком только в определённой области.


Эффекты и переходы

Phaser камеры поддерживают встроенные эффекты:

  • fade(duration, red, green, blue) — плавное затемнение или появление.
  • flash(duration, red, green, blue) — кратковременная вспышка.
  • shake(duration, intensityX, intensityY) — тряска камеры.

Эти эффекты можно комбинировать для каждой камеры отдельно, создавая динамичные сцены. Например, основная камера может следовать за игроком, а дополнительная — одновременно выполнять shake при столкновении с объектом.


Управление несколькими камерами

Менеджер камер позволяет легко переключаться между камерами и управлять их видимостью:

cam1.setVisible(true);
cam2.setVisible(false);

Можно также изменять z-order камер, чтобы одна камера накладывалась поверх другой:

cam2.setScroll(0, 0);
cam2.setDepth(1);

Использование нескольких камер позволяет одновременно отображать разные участки сцены, например, для split-screen игр, мини-карт или статистических панелей.


Примеры практического применения

  1. Split-screen мультиплеер: каждая камера отображает отдельного игрока.
  2. Мини-карта: маленькая камера с уменьшенным масштабом мира, показывающая положение объектов.
  3. Эффекты HUD и интерфейсов: отдельная камера фиксирована на UI, не реагируя на движение основной сцены.
  4. Сцены с параллаксом: несколько камер создают эффект глубины при прокрутке фона.

Использование CameraManager в Phaser позволяет создавать сложные визуальные эффекты и гибко управлять представлением сцены, повышая качество и динамику игрового опыта.