Ограничение движения камеры: setBounds

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

Синтаксис метода setBounds

camera.setBounds(x, y, width, height);

Параметры:

  • x — координата X верхнего левого угла области камеры.
  • y — координата Y верхнего левого угла области камеры.
  • width — ширина ограничивающей области.
  • height — высота ограничивающей области.

Все значения задаются в пикселях и обычно соответствуют размерам игрового мира или его активной области.

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

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

const game = new Phaser.Game(config);

function preload() {
    this.load.image('background', 'assets/background.png');
    this.load.image('player', 'assets/player.png');
}

function create() {
    const bg = this.add.image(0, 0, 'background').setOrigin(0, 0);
    
    this.player = this.physics.add.sprite(400, 300, 'player');
    
    this.cameras.main.startFollow(this.player);
    this.cameras.main.setBounds(0, 0, bg.width, bg.height);
}

function update() {
    const cursors = this.input.keyboard.createCursorKeys();

    if (cursors.left.isDown) {
        this.player.x -= 5;
    } else if (cursors.right.isDown) {
        this.player.x += 5;
    }

    if (cursors.up.isDown) {
        this.player.y -= 5;
    } else if (cursors.down.isDown) {
        this.player.y += 5;
    }
}

В этом примере камера следует за игроком, но не выходит за пределы фона, благодаря setBounds.

Взаимодействие с startFollow

Метод setBounds особенно важен при использовании camera.startFollow(target), так как без ограничения камера будет перемещаться вместе с объектом вне видимой области сцены. setBounds задаёт максимальный прямоугольник, в котором камера может следовать за объектом.

this.cameras.main.startFollow(this.player);
this.cameras.main.setBounds(0, 0, 2000, 1200);

Здесь камера будет следовать за игроком, но не уйдёт за границы 2000x1200 пикселей.

Ограничение движения нескольких камер

Phaser поддерживает несколько камер в одной сцене. Каждая камера может иметь свои границы:

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

cam1.setBounds(0, 0, 800, 600);
cam2.setBounds(400, 0, 800, 600);

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

Влияние setBounds на эффекты

Ограничение камеры влияет на многие эффекты Phaser:

  • Zoom и rotation — масштабирование и поворот камеры остаются в пределах границ. Камера не будет показывать пустое пространство за пределами setBounds.
  • Слой тайлов — при использовании Tilemap камеры автоматически ограничиваются размером слоя, но явное применение setBounds позволяет гибко управлять областями для UI или отдельных слоев.
  • Эффекты параллакса — объекты с разной скоростью движения могут быть привязаны к камере, при этом ограничения setBounds предотвращают их «выход» за пределы сцены.

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

  • Всегда задавать origin 0,0 для фона, если границы камеры совпадают с размером фона. Это предотвращает смещение видимой области.
  • Сравнивать размеры камеры и игрового мира. Если камера больше мира, следует скорректировать setBounds, иначе появятся пустые области.
  • Использовать setBounds перед startFollow, чтобы избежать рывков камеры при начале слежения.

Частые ошибки

  1. Отсутствие ограничения для подвижного объекта Камера может следовать за игроком за пределы видимой сцены.
  2. Неправильные размеры границ Указание width или height меньше, чем фактический размер сцены, обрежет видимую область.
  3. Игнорирование origin объекта Если фон или сцена имеют origin ≠ 0, границы камеры могут не совпадать с видимой областью.

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