Гравитация на уровне тела

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

Глобальная гравитация vs локальная

Phaser позволяет задавать глобальную гравитацию через конфигурацию сцены:

this.physics.world.gravity.y = 500;
  • Все тела с активированной физикой будут подвержены этому ускорению.
  • Локальная гравитация тела, заданная через body.setGravityY(), суммируется с глобальной.
  • Для объектов с нулевой локальной гравитацией сила будет полностью определяться глобальной настройкой.

Особенности Matter.js

В движке 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); // возвращение к нормальной гравитации
});

Такой подход открывает возможности для создания силовых полей, антигравитационных зон, гравитационных ловушек и платформеров с переменной физикой.

Важные нюансы

  • Установка гравитации на уровне тела не влияет на столкновения с другими объектами напрямую, но изменяет поведение при падении, скольжении и прыжках.
  • При смешении глобальной и локальной гравитации важно учитывать сумму ускорений: слишком большое значение может привести к “пробиванию” коллайдеров.
  • В Matter.js масштаб гравитации (gravityScale) можно комбинировать с локальными силами (applyForce) для более точного контроля движения.

Эффективное использование локальной гравитации тела позволяет создавать разнообразные игровые эффекты, делает поведение объектов уникальным и открывает возможности для сложной динамики в 2D-играх на Phaser.