Включение Arcade Physics и настройка гравитации

Физический движок 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 содержит:

  • default — имя используемого движка ('arcade');
  • arcade — параметры конкретно для Arcade Physics.

Если не указать 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 поддерживает два типа тел:

1. Dynamic Body

Создаётся через:

this.physics.add.sprite(...)

Характеристики:

  • Подвержено гравитации;
  • Реагирует на столкновения;
  • Может двигаться под действием сил.

2. Static Body

Создаётся через:

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

Если гравитация активна и границы не заданы, объект будет бесконечно падать.


Debug-режим

Для визуализации физических тел используется параметр:

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 не компенсирует гравитацию полностью — он лишь уменьшает горизонтальную скорость.


Частые ошибки при работе с гравитацией

  1. Отсутствие default: 'arcade'.
  2. Использование staticSprite для объектов, которые должны падать.
  3. Попытка управлять гравитацией через setVelocity.
  4. Отсутствие границ мира.
  5. Неверная ось (изменение 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-игр с простой механикой движения и столкновений.