Зум камеры: setZoom

В библиотеке Phaser управление камерой является одним из ключевых аспектов при создании динамических сцен. Метод setZoom позволяет изменять масштаб отображаемой сцены, увеличивая или уменьшая видимую область игрового мира. Это особенно полезно для акцентирования внимания на определённых объектах, создания эффектов приближения или отдаления, а также для адаптации интерфейса под разные размеры экрана.

Основы использования setZoom

Метод setZoom применяется к объекту камеры, который создаётся с помощью this.cameras.main (основная камера сцены) или кастомной камеры через this.cameras.add(). Синтаксис прост:

this.cameras.main.setZoom(масштаб);

Где масштаб — числовое значение:

  • 1 — стандартный размер без изменений.
  • >1 — увеличение масштаба (объекты становятся крупнее, видимая область уменьшается).
  • <1 — уменьшение масштаба (объекты становятся мельче, видимая область увеличивается).

Пример установки двойного увеличения камеры:

this.cameras.main.setZoom(2);

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

Плавное изменение масштаба с помощью анимаций

Для создания более динамичных эффектов часто используется плавное приближение или отдаление. В Phaser это достигается через камерные твины (tweens):

this.tweens.add({
    targets: this.cameras.main,
    zoom: 2,
    duration: 1000,
    ease: 'Power2'
});

Здесь:

  • targets — камера, к которой применяется эффект.
  • zoom — конечный уровень масштабирования.
  • duration — длительность анимации в миллисекундах.
  • ease — функция плавности изменения (можно использовать линейную или экспоненциальную для эффектов ускорения и замедления).

Использование твинов делает сцену более живой, позволяя создавать эффект «приближения к объекту» при интерактивных событиях.

Масштабирование камеры относительно центра и позиции

По умолчанию камера масштабируется относительно своего центра. Это означает, что при увеличении или уменьшении видимой области точка центра камеры остаётся фиксированной. Для управления точкой фокусировки можно использовать метод setScroll(x, y), который задаёт координаты верхнего левого угла видимой области:

this.cameras.main.setScroll(player.x - 400, player.y - 300);

Комбинируя setZoom и setScroll, можно создавать эффекты динамической камеры, которая следует за игроком, одновременно меняя масштаб:

this.cameras.main.setZoom(1.5);
this.cameras.main.startFollow(player);

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

this.cameras.main.startFollow(player, true, 0.1, 0.1);
this.cameras.main.setBounds(0, 0, worldWidth, worldHeight);

Ограничение масштаба камеры

Phaser не ограничивает масштаб камеры по умолчанию, но для удобства и предотвращения чрезмерного увеличения сцены рекомендуется использовать логические пределы:

let zoomLevel = Phaser.Math.Clamp(this.cameras.main.zoom, 0.5, 3);
this.cameras.main.setZoom(zoomLevel);

Phaser.Math.Clamp обеспечивает, чтобы значение зума оставалось в диапазоне от 0.5 до 3, предотвращая искажения или потерю видимой области.

Интерактивный зум

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

this.input.on('wheel', (pointer, gameObjects, deltaX, deltaY, deltaZ) => {
    let newZoom = Phaser.Math.Clamp(this.cameras.main.zoom - deltaY * 0.001, 0.5, 3);
    this.cameras.main.setZoom(newZoom);
});

В этом примере:

  • deltaY отражает направление прокрутки.
  • Коэффициент 0.001 регулирует чувствительность.
  • Phaser.Math.Clamp ограничивает диапазон зума.

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

Совмещение зума с эффектами камеры

Метод setZoom можно комбинировать с другими функциями камеры, такими как:

  • fadeIn / fadeOut — плавное появление или исчезновение сцены.
  • shake — тряска камеры при взрывах или ударах.
  • flash — кратковременное осветление сцены.

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

this.cameras.main.setZoom(1.5);
this.cameras.main.shake(200, 0.01);

Камера увеличивается и одновременно создаётся эффект небольшого сотрясения, что добавляет драматичности сцене.

Рекомендации по производительности

  • Частое изменение масштаба в больших сценах может снижать производительность. Рекомендуется плавное изменение через твины, а не мгновенные скачки.
  • Масштабирование затрагивает все объекты сцены, поэтому важно оптимизировать слои с большим количеством спрайтов и использовать tilemap layers для статических элементов.

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

  • Приближение к персонажу в битвах или к ключевым объектам уровня.
  • Эффект «кинематографического» зума при событиях или катсценах.
  • Адаптивная камера для разных разрешений экрана и соотношений сторон.
  • Миникарта с уменьшенным масштабом, где видимая область — часть основной сцены.

setZoom в Phaser предоставляет гибкий и мощный инструмент управления визуальным восприятием сцены. Комбинация масштабирования с следованием камеры, твинами и событиями ввода позволяет создавать интерактивные и динамичные игровые миры.