О чем этот пример

Управление камерами — ключевой навык для создания сложных игровых миров. В Phaser вы можете добавлять несколько камер, каждая со своими свойствами. Этот пример показывает, как создать дополнительную камеру, которая работает как мини-карта или прицел, динамически следуя за движущейся точкой на большой карте. Этот подход полезен для реализации карт местности, систем слежения за персонажем или создания эффекта "пип-бола" (picture-in-picture) в реальном времени, не затрагивая основную камеру сцены.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    preload () 
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('CherilPerils', 'assets/tests/camera/CherilPerils.png');
        this.iter = 0;
    }

    create () 
    {
        this.image = this.add.image(0, 0, 'CherilPerils')
            .setOrigin(0);
        this.smallCamera = this.cameras.add(570, 30, 200, 200);
    }

    update () 
    {
        const halfWidth = this.image.texture.source[0].width / 2;
        const quarterWidth = halfWidth / 2;
        const halfHeight = this.image.texture.source[0].height / 2;
        const quarterHeight = halfHeight / 2;
    
        this.smallCamera.scrollX = halfWidth + Math.cos(this.iter) * halfWidth;
        this.iter += 0.02;
    }
}

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: Example
};

const game = new Phaser.Game(config);

Инициализация сцены и загрузка ресурсов

В методе preload мы загружаем одно большое изображение — карту уровня. Важно использовать setBaseURL, чтобы указать базовый путь для загрузчику. Также здесь инициализируется переменная iter, которая будет использоваться для анимации.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('CherilPerils', 'assets/tests/camera/CherilPerils.png');
    this.iter = 0;
}

Создание мира и дополнительной камеры

В create мы добавляем изображение карты в точку (0, 0) и устанавливаем точку привязки (origin) в 0, чтобы его левый верхний угол совпал с началом координат мира. Это важно для точных расчетов скроллинга.

Затем создается вторая камера с помощью this.cameras.add. Ей задаются координаты (570, 30) и размеры 200x200 пикселя. Эта камера будет отображаться поверх основной сцены как отдельное окно.

create ()
{
    this.image = this.add.image(0, 0, 'CherilPerils')
        .setOrigin(0);
    this.smallCamera = this.cameras.add(570, 30, 200, 200);
}

Динамический расчет области видимости

В методе update вычисляются ключевые точки карты: половина и четверть от её ширины и высоты. Эти значения берутся непосредственно из текстуры загруженного изображения через this.image.texture.source[0].

const halfWidth = this.image.texture.source[0].width / 2;
const quarterWidth = halfWidth / 2;
const halfHeight = this.image.texture.source[0].height / 2;
const quarterHeight = halfHeight / 2;

Анимация скроллинга камеры

Сердцевина примера — анимированное изменение свойства scrollX у маленькой камеры. Положение скролла рассчитывается так, чтобы камера перемещалась по горизонтали вокруг центра карты по косинусоидальной траектории.

Переменная iter плавно увеличивается каждый кадр, создавая непрерывное движение. Изменяя множитель и формулу, можно задать любой паттерн движения.

this.smallCamera.scrollX = halfWidth + Math.cos(this.iter) * halfWidth;
this.iter += 0.02;

Конфигурация и запуск игры

Стандартная конфигурация игры определяет её тип, контейнер на странице, размеры и главную сцену. После создания экземпляра Phaser.Game с этой конфигурацией игра запускается.

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: Example
};

const game = new Phaser.Game(config);

Что попробовать дальше

Вы научились создавать дополнительные камеры в Phaser и управлять их скроллингом в реальном времени. Это открывает путь к созданию сложных интерфейсов и игровых механик. Идеи для экспериментов: 1. Заставьте камеру следовать за движением курсора мыши или спрайтом персонажа. 2. Добавьте зум для маленькой камеры с помощью свойства zoom. 3. Создайте несколько камер с разными областями видимости для реализации системы сплит-скрина. 4. Измените цветовой тон или добавьте эффекты (например, размытие) к камере через setPostPipeline.