Гравитация и ускорение частиц

В 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();
});

Так частицы реагируют на платформы или стены, имитируя столкновение с поверхностью.


Оптимизация и производительность

Работа с большим количеством частиц и объектов с гравитацией требует внимательного подхода к оптимизации:

  • Использовать Arcade Physics для большинства задач, так как Matter.js более тяжёлый.
  • Ограничивать количество активных частиц через maxParticles.
  • Управлять lifespan частиц, чтобы не держать объекты в памяти дольше необходимого.
  • Использовать body.allowGravity = false для объектов, которые должны игнорировать глобальную гравитацию.

Комбинированные эффекты

Объединение гравитации, ускорения, сопротивления и коллизий позволяет создавать сложные сценарии движения:

  • Падающий метеор с ускорением и сопротивлением воздуха.
  • Взрыв с разлетом частиц по дуге с изменением ускорения и скорости.
  • Плавающие платформы с переменной гравитацией для динамических уровней.

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