В библиотеке Phaser метод
setCollideWorldBounds используется для ограничения движения
спрайтов внутри игрового мира. Это ключевой инструмент при создании игр,
где персонажи, объекты или снаряды не должны выходить за пределы сцены.
Метод применяется к физическим объектам, поддерживающим системы физики
Arcade, Matter или других встроенных движков, но чаще всего — к Arcade
Physics.
sprite.setCollideWorldBounds([value]);
this.player).true или
false), определяющее, будет ли объект ограничен границами
мира. По умолчанию false.Пример:
this.player = this.physics.add.sprite(100, 100, 'player');
this.player.setCollideWorldBounds(true);
После вызова этого метода спрайт больше не сможет покидать границы игровой сцены, даже если к нему применяются силы или скорость.
Arcade Physics поддерживает два ключевых механизма для столкновения с границами мира:
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.