В 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() не удаляет объект из сцены. Он остаётся
активным и может быть видим в других камерах.
Контейнеры (Container) позволяют группировать несколько
объектов. Если контейнер добавлен в ignore-список камеры, все
дочерние объекты контейнера также игнорируются:
let container = this.add.container(100, 100, [sprite1, sprite2]);
camera.ignore(container);
Для выборочного игнорирования объектов внутри контейнера необходимо добавлять в ignore отдельные дочерние элементы, а не контейнер целиком.
Ignore-список камеры можно изменять в процессе игры:
// Исключить объект
camera.ignore(sprite);
// Вернуть объект обратно в рендер камеры
camera.resetFX(); // сбрасывает все эффекты камеры
camera.removeFromRenderList(sprite); // удаляет только из ignore
Для более гибкого управления можно использовать методы камеры:
camera.ignore(sprite) — добавить объект в ignore.camera.resetFX() — сбросить все визуальные эффекты (в
том числе ignore и фильтры).camera.removeFromRenderList(sprite) — удалить объект из
ignore, не трогая другие эффекты.Когда сцена использует несколько камер, важно помнить:
ignore выше в стеке не покажет объекты, даже если нижние
камеры их рендерят.Пример с двумя камерами:
let mainCamera = this.cameras.main;
let miniCamera = this.cameras.add(0, 0, 200, 150);
miniCamera.ignore(player); // игрок не виден в миникарте
В этом примере объект player не отображается в
миникарте, но остаётся видимым для основной камеры.
// Основная сцена
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, а миникарта отображает только динамичные объекты, игнорируя статические и интерфейсные элементы.
Такой подход позволяет создавать гибкие системы камер с независимыми видами сцены, динамическим отображением объектов и оптимизацией рендера.