Ограничение движения: setCollideWorldBounds

В библиотеке Phaser метод setCollideWorldBounds используется для ограничения движения спрайтов внутри игрового мира. Это ключевой инструмент при создании игр, где персонажи, объекты или снаряды не должны выходить за пределы сцены. Метод применяется к физическим объектам, поддерживающим системы физики Arcade, Matter или других встроенных движков, но чаще всего — к Arcade Physics.


Основной синтаксис

sprite.setCollideWorldBounds([value]);
  • sprite — объект, к которому применяется ограничение (например, this.player).
  • value — логическое значение (true или false), определяющее, будет ли объект ограничен границами мира. По умолчанию false.

Пример:

this.player = this.physics.add.sprite(100, 100, 'player');
this.player.setCollideWorldBounds(true);

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


Взаимодействие с физикой Arcade

Arcade Physics поддерживает два ключевых механизма для столкновения с границами мира:

  1. Ограничение позиции: объект автоматически останавливается при контакте с границей.
  2. Отскок: при использовании свойства bounce объект может отскакивать от границы.

Пример настройки отскока:

this.player.setCollideWorldBounds(true);
this.player.setBounce(1); // Полный отскок при столкновении с границами

Если bounce установлен в 0, объект просто останавливается у края сцены. Если значение больше 0, объект будет отскакивать пропорционально заданной величине.


Управление отдельными сторонами сцены

Arcade Physics позволяет задавать индивидуальное поведение для каждой стороны границ с помощью свойства body.checkCollision:

this.player.body.checkCollision.up = false;    // Игрок может выходить через верх
this.player.body.checkCollision.down = true;   // Столкновения снизу
this.player.body.checkCollision.left = true;   // Столкновения слева
this.player.body.checkCollision.right = true;  // Столкновения справа

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


Сочетание с управлением скоростью

Часто setCollideWorldBounds используется вместе с методами управления движением, например setVelocity:

this.cursors = this.input.keyboard.createCursorKeys();

if (this.cursors.left.isDown) {
    this.player.setVelocityX(-160);
} else if (this.cursors.right.isDown) {
    this.player.setVelocityX(160);
} else {
    this.player.setVelocityX(0);
}

if (this.cursors.up.isDown && this.player.body.touching.down) {
    this.player.setVelocityY(-330);
}

В этом примере объект не выходит за пределы мира благодаря setCollideWorldBounds(true), а физика движений остаётся естественной.


Использование в играх с камерой

Когда сцена имеет камеру, которая следует за игроком, важно понимать, что границы мира должны быть правильно заданы с помощью this.physics.world.setBounds:

this.physics.world.setBounds(0, 0, 800, 600);
this.cameras.main.setBounds(0, 0, 800, 600);
this.player.setCollideWorldBounds(true);

Если границы мира меньше сцены камеры, объект может выйти за пределы видимой области. Установка соответствующих размеров world bounds гарантирует корректную работу ограничения.


Отладка и визуализация границ

Для проверки работы setCollideWorldBounds удобно включить визуализацию физических тел:

this.physics.world.createDebugGraphic();

или использовать параметры debug при создании Arcade Physics:

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    physics: {
        default: 'arcade',
        arcade: {
            debug: true
        }
    },
    scene: [MainScene]
};

На экране будут видны прямоугольники, отображающие тела и их столкновения с границами.


Важные нюансы

  • setCollideWorldBounds работает только с физикой, без неё метод не имеет эффекта.
  • Свойство immovable объекта не влияет на работу ограничения — даже неподвижный объект будет оставаться внутри границ.
  • Для объектов с динамической скоростью (например, с velocity) столкновение с границей может вызывать кратковременные сдвиги, если не настроен drag или friction.

Резюме по использованию

  • setCollideWorldBounds(true) — базовое средство ограничения движения.
  • В сочетании с bounce, checkCollision и физикой движения можно создавать сложные поведения объектов.
  • Необходимо синхронизировать границы мира с камерой и размерами сцены.
  • Использование режима debug помогает визуально убедиться в корректности ограничений.

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