Phaser предоставляет гибкий подход к физике объектов через встроенные движки, такие как Arcade Physics, Matter.js и Impact. Одним из ключевых аспектов управления объектами является способность задавать гравитацию не глобально, а индивидуально для каждого тела, что позволяет создавать сложные динамические эффекты в играх.
Каждое игровое тело в Phaser создается с помощью метода
this.physics.add.sprite или аналогичных методов для других
типов объектов. После создания можно получить доступ к его свойствам
через объект body. Например, в Arcade
Physics тело имеет следующие ключевые параметры:
const player = this.physics.add.sprite(100, 100, 'player');
player.body.setGravityY(300);
Пояснения:
setGravityY(value) — задает вертикальную гравитацию
только для этого объекта.value измеряется в пикселях в секунду². Например,
300 создаст умеренное ускорение вниз.Phaser позволяет настраивать гравитацию не только по вертикали, но и по горизонтали. Это полезно для реализации эффектов ветра, тяги или нестандартной гравитации:
player.body.setGravity(100, 200);
100) — горизонтальная гравитация.200) — вертикальная гравитация.Для динамических эффектов гравитацию можно изменять во время игры:
if (player.y > 300) {
player.body.setGravityY(600);
} else {
player.body.setGravityY(200);
}
Phaser позволяет задавать глобальную гравитацию через конфигурацию сцены:
this.physics.world.gravity.y = 500;
body.setGravityY(), суммируется с глобальной.В движке Matter.js управление гравитацией несколько отличается:
const box = this.matter.add.sprite(100, 100, 'box');
box.setIgnoreGravity(false);
box.setGravityScale(0.5);
setIgnoreGravity(true) — отключает влияние глобальной
гравитации на тело.setGravityScale(value) — масштабирует действие
гравитации на конкретное тело.Гравитация на уровне тела эффективно сочетается с импульсами, трением и сопротивлением воздуха. Например:
player.body.setGravityY(400);
player.body.setFriction(0.1);
player.body.setBounce(0.5);
player.body.setDrag(50);
setFriction — снижает скорость скольжения по
поверхности.setBounce — задает упругость при столкновениях.setDrag — сопротивление движению в пространстве,
особенно при горизонтальной гравитации.Такое сочетание позволяет создавать реалистичные физические эффекты, где гравитация действует индивидуально для каждого объекта, а динамика реагирует на изменения условий среды.
Гравитацию можно изменять динамически через игровой цикл, создавая сложные игровые механики:
this.input.on('pointerdown', () => {
player.body.setGravityY(1000); // сильное падение при клике
});
this.input.on('pointerup', () => {
player.body.setGravityY(300); // возвращение к нормальной гравитации
});
Такой подход открывает возможности для создания силовых полей, антигравитационных зон, гравитационных ловушек и платформеров с переменной физикой.
gravityScale) можно
комбинировать с локальными силами (applyForce) для более
точного контроля движения.Эффективное использование локальной гравитации тела позволяет создавать разнообразные игровые эффекты, делает поведение объектов уникальным и открывает возможности для сложной динамики в 2D-играх на Phaser.