Общая архитектура физических систем в Phaser

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

В составе фреймворка доступны три основных варианта:

  • Arcade Physics — встроенный легковесный движок.
  • Matter Physics — интеграция с Matter.js.
  • Impact Physics — интеграция с Impact (доступна как плагин).

Каждая система реализует собственный набор сущностей, обработчиков столкновений и механизмов обновления, но все они встроены в единую модель жизненного цикла сцены.


Интеграция физики в жизненный цикл Scene

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

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    physics: {
        default: 'arcade',
        arcade: {
            gravity: { y: 300 },
            debug: true
        }
    },
    scene: [MainScene]
};

После инициализации физический движок становится частью экземпляра сцены:

this.physics

Обновление физики встроено в основной цикл рендеринга:

  1. Scene.update()
  2. Обновление тел и вычисление столкновений
  3. Разрешение коллизий
  4. Синхронизация визуальных объектов с физическими телами

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


Модель мира (World)

Каждая физическая система содержит объект World — центральный компонент, отвечающий за:

  • хранение списка физических тел,
  • обработку столкновений,
  • применение глобальных сил (гравитация),
  • ограничение мира (bounds),
  • оптимизацию вычислений.

Пример для Arcade Physics:

this.physics.world.setBounds(0, 0, 2000, 2000);

World управляет временным шагом (delta), масштабом симуляции и стратегией широкофазного поиска столкновений (broadphase).


Физические тела (Body)

Физическое тело — это структура данных, связанная с игровым объектом. В Phaser тело не существует автономно: оно всегда прикрепляется к GameObject.

Создание тела:

const player = this.physics.add.sprite(100, 100, 'player');

При этом создаётся:

  • визуальный объект (Sprite),
  • физическое тело (Arcade.Body).

Основные параметры тела

  • velocity — скорость
  • acceleration — ускорение
  • gravity — индивидуальная гравитация
  • bounce — коэффициент упругости
  • immovable — неподвижность
  • allowGravity — включение/отключение гравитации

Архитектурно тело отделено от рендеринга: физика обновляет координаты, а затем синхронизирует их с отображаемым объектом.


Типы тел: Dynamic и Static

В Arcade Physics существует два базовых типа тел:

Dynamic Body

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

Создание:

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

Static Body

  • Не двигается
  • Используется как препятствие
  • Оптимизировано для производительности

Создание:

this.physics.add.staticSprite(...)

Статические тела участвуют в проверке столкновений, но не обновляются каждый кадр, что снижает нагрузку.


Система столкновений

Broadphase

Первичный этап — грубая проверка пересечений по ограничивающим прямоугольникам (AABB). Используется пространственное разбиение (QuadTree), что уменьшает количество проверок.

Narrowphase

После предварительного отбора происходит точная проверка пересечения тел.

В Arcade Physics используется прямоугольная модель (AABB), без поворотов и сложных полигонов.

В Matter Physics используется SAT (Separating Axis Theorem), что позволяет работать с:

  • многоугольниками,
  • кругами,
  • составными телами.

Коллайдеры и Overlap

Phaser разделяет:

  • Collider — физическое столкновение с разрешением.
  • Overlap — логическая проверка пересечения без реакции.

Пример коллайдера:

this.physics.add.collider(player, platforms);

Пример overlap:

this.physics.add.overlap(player, coins, collectCoin);

Архитектурно коллайдер регистрируется в World и вызывается автоматически во время фазы разрешения столкновений.


Группы объектов

Физические группы упрощают управление множеством тел:

const enemies = this.physics.add.group({
    velocityX: 100,
    bounceX: 1
});

Группа хранит:

  • список объектов,
  • общие параметры,
  • методы массовой модификации.

При создании группы движок автоматически создаёт тела для каждого добавленного объекта.


Гравитация и силы

В Arcade Physics применяется простая модель:

velocity += gravity * delta
position += velocity * delta

Гравитация может быть:

  • глобальной (через World),
  • локальной (для конкретного тела).

В Matter Physics поддерживаются:

  • силы (applyForce),
  • крутящий момент,
  • трение,
  • плотность,
  • масса,
  • центр масс.

Таким образом, архитектура Matter ориентирована на более точную физическую модель.


Ограничения мира и коллизии с границами

World имеет собственные границы:

this.physics.world.setBoundsCollision(true, true, true, true);

Тело может быть настроено на столкновение с границами:

player.setCollideWorldBounds(true);

Границы мира обрабатываются как специальные статические тела.


Debug-система

Arcade Physics содержит встроенный режим отладки:

arcade: {
    debug: true
}

Отображаются:

  • границы тел,
  • векторы скорости,
  • зоны столкновений.

Это отдельный слой визуализации, не влияющий на расчёты.


Различия архитектуры Arcade и Matter

Характеристика Arcade Matter
Модель тел AABB Полигональная
Повороты Нет Да
Составные тела Нет Да
Точность Средняя Высокая
Производительность Высокая Ниже

Arcade реализован внутри ядра Phaser и оптимизирован для 2D-аркад. Matter подключается как внешний движок и предоставляет полноценную физическую модель.


Временной шаг и детерминированность

Физическая система использует переменный временной шаг (delta), основанный на частоте кадров. Это упрощает интеграцию, но снижает детерминированность.

В Matter возможно включение фиксированного шага для большей стабильности симуляции.


Пространственная оптимизация

Arcade Physics применяет:

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

Matter использует собственную систему broadphase, основанную на сортировке по осям (Sweep and Prune).


Архитектурная модель взаимодействия

Структурно физическая система в Phaser состоит из:

  1. Scene
  2. Physics Plugin
  3. World
  4. Bodies
  5. Colliders
  6. Resolver
  7. Sync Layer

Каждый уровень изолирован:

  • Scene управляет логикой.
  • Physics Plugin инициализирует мир.
  • World управляет телами.
  • Resolver обрабатывает столкновения.
  • Sync Layer обновляет визуальные объекты.

Такое разделение обеспечивает:

  • масштабируемость,
  • возможность замены движка,
  • низкую связанность компонентов.

Расширяемость

Phaser позволяет:

  • писать собственные плагины физики,
  • переопределять обработчики столкновений,
  • внедрять пользовательские силы,
  • создавать гибридные системы (например, Arcade + кастомная логика).

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


Взаимодействие с другими подсистемами

Физика тесно связана с:

  • системой ввода (изменение velocity по клавишам),
  • анимацией (смена состояния по событию столкновения),
  • камерой (следование за телом),
  • системой таймеров.

При этом физический расчёт изолирован от логики отображения, что позволяет контролировать производительность и поведение объектов независимо.


Архитектура физических систем Phaser построена по принципу модульности и разделения ответственности. Лёгкий встроенный движок Arcade обеспечивает высокую производительность для большинства 2D-игр, а интеграция Matter предоставляет расширенные возможности точной симуляции. Такая структура позволяет адаптировать физику под конкретные требования проекта, сохраняя единый интерфейс взаимодействия внутри сцены.