В Phaser гравитация реализуется через физические движки, такие как Arcade Physics, Matter.js и Impact Physics, каждый из которых предоставляет собственные методы управления силами, ускорениями и взаимодействиями объектов. Наиболее часто используется Arcade Physics, благодаря простоте настройки и производительности.
Гравитация в Arcade Physics задаётся через свойство
gravity объекта physics.world:
this.physics.world.gravity.y = 300;
Здесь y — вертикальная составляющая гравитации,
измеряемая в пикселях в секунду². Положительное значение направлено
вниз, отрицательное — вверх. Для горизонтальной гравитации используется
свойство x.
Каждому объекту можно задавать индивидуальную гравитацию:
player.body.setGravityY(500);
player.body.setGravityX(200);
Это позволяет создавать эффекты, когда разные объекты реагируют на гравитацию по-разному, например, тяжёлые предметы падают быстрее, лёгкие медленнее.
В Phaser ускорение объектов контролируется через свойства
velocity и acceleration:
velocity — мгновенная скорость объекта в пикселях в
секунду.acceleration — скорость изменения скорости объекта,
т.е. сила, действующая на объект.Пример задания ускорения:
player.body.setAccelerationY(600);
player.body.setAccelerationX(300);
Важно понимать разницу между гравитацией и ускорением: гравитация действует постоянно и глобально на объект, ускорение задаётся конкретно и может быть динамическим, например, при нажатии клавиш для движения.
Для плавного изменения скорости применяется drag — сила
сопротивления:
player.body.setDrag(200, 0);
Это позволяет создавать реалистичное замедление после прекращения ускорения, имитируя трение.
Phaser предоставляет Particle Emitter для создания визуальных эффектов, таких как дождь, пыль или взрывы. Частицы можно интегрировать с физикой для естественного поведения под действием гравитации и ускорения.
Пример создания эмиттера с гравитацией:
const particles = this.add.particles('particleImage');
const emitter = particles.createEmitter({
x: 400,
y: 100,
speed: { min: 100, max: 300 },
gravityY: 200,
lifespan: 2000,
quantity: 5,
scale: { start: 1, end: 0 },
});
speed — начальная скорость частиц.gravityY — вертикальная гравитация, действующая на
каждую частицу.lifespan — время жизни частицы в миллисекундах.scale — изменение размера от появления до
исчезновения.Можно комбинировать гравитацию с ускорением:
emitter.setAccelerationY(100);
emitter.setAccelerationX(-50);
Это позволяет частицам не только падать вниз, но и смещаться в сторону, создавая сложные эффекты ветра или взрыва.
Хотя частицы обычно не имеют физического тела, их можно настроить для
взаимодействия с другими объектами через
physics.add.overlap или
physics.add.collider:
this.physics.add.collider(emitter, platforms, (particle, platform) => {
particle.destroy();
});
Так частицы реагируют на платформы или стены, имитируя столкновение с поверхностью.
Работа с большим количеством частиц и объектов с гравитацией требует внимательного подхода к оптимизации:
maxParticles.lifespan частиц, чтобы не держать объекты в
памяти дольше необходимого.body.allowGravity = false для объектов,
которые должны игнорировать глобальную гравитацию.Объединение гравитации, ускорения, сопротивления и коллизий позволяет создавать сложные сценарии движения:
Применение этих механик в Phaser создаёт реалистичную и управляемую физику объектов и частиц, что позволяет создавать захватывающие игровые сцены с минимальными затратами ресурсов.