Физический движок Arcade Physics — это встроенная система физики в Phaser, предназначенная для 2D-игр с простой моделью столкновений и динамики. Он оптимизирован для высокой производительности и удобен при создании платформеров, аркад и динамических экшен-игр.
Включение физики происходит на этапе создания экземпляра игры через объект конфигурации:
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
physics: {
default: 'arcade',
arcade: {
gravity: { y: 300 },
debug: false
}
},
scene: [MainScene]
};
const game = new Phaser.Game(config);
physicsОбъект physics содержит:
'arcade');Если не указать default, физический движок не будет
активирован, даже при наличии настроек внутри arcade.
Гравитация в Arcade Physics — это постоянное ускорение, применяемое к динамическим телам. Она не является глобальной силой в физическом смысле, а представляет собой изменение скорости по заданной оси.
Основная формула, используемая движком:
velocity += gravity * deltaTime
Гравитация задаётся в пикселях в секунду в квадрате.
Гравитация задаётся как объект:
gravity: { x: 0, y: 300 }
y — движение вниз.y — движение вверх.x — движение вправо.x — движение влево.В 2D-координатной системе Phaser ось Y направлена вниз, поэтому положительное значение создаёт эффект падения.
Глобальная гравитация применяется ко всем динамическим телам сцены, если они не переопределяют её локально.
Пример:
physics: {
default: 'arcade',
arcade: {
gravity: { y: 500 }
}
}
В этом случае все объекты с включённой физикой будут ускоряться вниз с ускорением 500 px/s².
Каждое физическое тело может иметь собственную гравитацию, переопределяющую глобальную.
Создание объекта с физикой:
this.player = this.physics.add.sprite(100, 100, 'player');
Изменение гравитации только для него:
this.player.body.setGravityY(800);
Либо полная настройка:
this.player.body.setGravity(0, 1000);
Если необходимо полностью отключить гравитацию для объекта:
this.player.body.setAllowGravity(false);
Это часто применяется для:
Arcade Physics поддерживает два типа тел:
Создаётся через:
this.physics.add.sprite(...)
Характеристики:
Создаётся через:
this.physics.add.staticSprite(...)
Характеристики:
Пример платформы:
this.platform = this.physics.add.staticSprite(400, 550, 'ground');
gravity: { y: 1000 }
Высокая гравитация создаёт ощущение “тяжёлого” персонажа.
gravity: { y: 300 }
Движение становится более плавным.
gravity: { y: 0 }
Или отключение гравитации у всех тел.
Для корректной работы гравитации важно ограничить границы игрового мира:
this.physics.world.setBounds(0, 0, 800, 600);
Чтобы объект не выпадал за пределы экрана:
this.player.setCollideWorldBounds(true);
Если гравитация активна и границы не заданы, объект будет бесконечно падать.
Для визуализации физических тел используется параметр:
arcade: {
debug: true
}
Включается отображение:
Debug особенно полезен при настройке гравитации и корректировке размеров коллайдеров.
В Arcade Physics масса не влияет на ускорение от гравитации. Все динамические тела получают одинаковое ускорение независимо от значения массы.
Масса влияет только на:
Установка массы:
this.player.body.setMass(2);
Гравитацию можно изменить динамически:
this.physics.world.gravity.y = 1500;
Или полностью:
this.physics.world.gravity.set(0, -500);
Такой приём используется для:
Гравитация влияет на скорость, но её можно ограничить:
this.player.body.setMaxVelocity(300, 600);
Это предотвращает чрезмерное ускорение при длительном падении.
Дополнительно можно использовать замедление:
this.player.body.setDrag(100);
Однако drag не компенсирует гравитацию полностью — он лишь уменьшает горизонтальную скорость.
default: 'arcade'.staticSprite для объектов, которые должны
падать.setVelocity.x вместо y).class MainScene extends Phaser.Scene {
constructor() {
super('MainScene');
}
preload() {
this.load.image('player', 'assets/player.png');
this.load.image('ground', 'assets/ground.png');
}
create() {
this.physics.world.setBounds(0, 0, 800, 600);
const ground = this.physics.add.staticSprite(400, 580, 'ground');
const player = this.physics.add.sprite(400, 100, 'player');
player.setCollideWorldBounds(true);
this.physics.add.collider(player, ground);
}
}
В этом примере:
Arcade Physics обеспечивает минималистичную, но эффективную систему гравитации, достаточную для большинства 2D-игр с простой механикой движения и столкновений.