Ignore-список объектов для конкретной камеры

В Phaser камеры используются для управления видимой областью сцены. Каждая камера может иметь собственные настройки отображения, позиции, зума и вращения. Иногда возникает необходимость, чтобы определённые объекты сцены не рендерились одной камерой, но при этом оставались видимыми для других камер. Для решения этой задачи используется ignore-список объектов.


Создание и настройка камеры

В Phaser 3 камеры создаются через объект сцены:

this.cameras.main; // главная камера сцены
this.cameras.add(x, y, width, height); // дополнительная камера

Параметры x, y, width и height задают область просмотра камеры. Камеры могут накладываться друг на друга, иметь различный зум (zoom) и эффект размытия или следования за объектом.


Игнорирование объектов камерой

Метод ignore() позволяет исключить объекты из рендера конкретной камеры:

camera.ignore(gameObject);
  • camera — объект камеры (Phaser.Cameras.Scene2D.Camera).
  • gameObject — любой объект сцены (Sprite, Image, Text, Container и т.д.).

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

Для множественного исключения объектов можно использовать массив:

camera.ignore([object1, object2, object3]);

Важно: ignore() не удаляет объект из сцены. Он остаётся активным и может быть видим в других камерах.


Применение ignore в контейнерах

Контейнеры (Container) позволяют группировать несколько объектов. Если контейнер добавлен в ignore-список камеры, все дочерние объекты контейнера также игнорируются:

let container = this.add.container(100, 100, [sprite1, sprite2]);
camera.ignore(container);

Для выборочного игнорирования объектов внутри контейнера необходимо добавлять в ignore отдельные дочерние элементы, а не контейнер целиком.


Динамическое управление списком ignore

Ignore-список камеры можно изменять в процессе игры:

// Исключить объект
camera.ignore(sprite);

// Вернуть объект обратно в рендер камеры
camera.resetFX(); // сбрасывает все эффекты камеры
camera.removeFromRenderList(sprite); // удаляет только из ignore

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

  • camera.ignore(sprite) — добавить объект в ignore.
  • camera.resetFX() — сбросить все визуальные эффекты (в том числе ignore и фильтры).
  • camera.removeFromRenderList(sprite) — удалить объект из ignore, не трогая другие эффекты.

Игнорирование объектов при множественных камерах

Когда сцена использует несколько камер, важно помнить:

  1. Игнорирование объекта работает только для конкретной камеры.
  2. Один объект может быть видим в одной камере и игнорирован в другой.
  3. Порядок рендеринга камер влияет на визуальный результат. Камера с ignore выше в стеке не покажет объекты, даже если нижние камеры их рендерят.

Пример с двумя камерами:

let mainCamera = this.cameras.main;
let miniCamera = this.cameras.add(0, 0, 200, 150);

miniCamera.ignore(player); // игрок не виден в миникарте

В этом примере объект player не отображается в миникарте, но остаётся видимым для основной камеры.


Советы по использованию ignore

  • Игнорирование UI элементов: Эффективно для элементов интерфейса, которые должны оставаться видимыми только на одной камере.
  • Производительность: Использование ignore уменьшает нагрузку на рендер, если камеры не должны показывать все объекты.
  • Контейнеры и группы: Добавление в ignore контейнеров удобнее, чем игнорирование каждого объекта по отдельности.
  • Динамическое переключение: Можно создавать эффекты «призрачных» объектов, добавляя их в ignore на время и возвращая обратно по событию.

Пример комплексного использования

// Основная сцена
let background = this.add.image(400, 300, 'bg');
let player = this.add.sprite(400, 300, 'player');
let ui = this.add.container(0, 0, [
    this.add.text(10, 10, 'Score: 0'),
    this.add.text(10, 30, 'Lives: 3')
]);

let miniCamera = this.cameras.add(600, 400, 200, 150);
miniCamera.ignore(ui); // миникарта не показывает UI
miniCamera.ignore(background); // миникарта показывает только игрока

В этом примере основная камера показывает весь экран, включая UI, а миникарта отображает только динамичные объекты, игнорируя статические и интерфейсные элементы.


Такой подход позволяет создавать гибкие системы камер с независимыми видами сцены, динамическим отображением объектов и оптимизацией рендера.