Статические тела и сенсоры

Phaser — мощная библиотека для разработки 2D-игр на JavaScript, включающая встроенный физический движок Arcade Physics, который позволяет создавать реалистичное поведение объектов. Одними из ключевых инструментов для управления столкновениями и взаимодействиями являются статические тела и сенсоры.


Статические тела

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

Создание статического тела

В Phaser статическое тело создаётся через this.physics.add.staticGroup() или this.physics.add.staticSprite().

// Создание статического спрайта
const ground = this.physics.add.staticSprite(400, 568, 'ground');

// Создание группы статических объектов
const platforms = this.physics.add.staticGroup();
platforms.create(400, 568, 'ground').setScale(2).refreshBody();
platforms.create(600, 400, 'ground');

Ключевые моменты:

  • setScale — изменяет масштаб объекта.
  • refreshBody() — обновляет физическое тело после изменения размеров, обязательно для статических тел.
  • Статические объекты не двигаются сами, но динамические тела могут отскакивать от них, сталкиваться или скользить по ним.

Использование в коллизиях

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

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

В этом примере player — динамическое тело, которое будет реагировать на столкновения со статическими платформами.


Сенсоры

Сенсор — объект, который обнаруживает пересечения с другими телами, но не вызывает физической реакции. Он полезен для триггеров, зон урона, зон активации событий или областей взаимодействия.

Создание сенсора

Сенсор в Phaser определяется через свойства физического тела:

const sensor = this.physics.add.sprite(300, 300, 'sensor');
sensor.body.setAllowGravity(false); // не подвержен гравитации
sensor.body.setImmovable(true);     // не движется при столкновениях
sensor.body.setSize(50, 50);        // задаём размер сенсора
sensor.body.setOffset(0, 0);        // смещение тела
sensor.body.checkCollision.none = true; // отключаем физические реакции

Особенности сенсоров:

  • Можно использовать для отслеживания входа объекта в зону через события overlap.
  • Сенсор не блокирует движение других объектов.
  • Можно комбинировать с анимацией и визуальными эффектами для создания интерактивных областей.

Использование overlap

this.physics.add.overlap(player, sensor, () => {
    console.log('Игрок вошёл в зону сенсора!');
});
  • overlap срабатывает при пересечении тел, без применения силы или импульса.
  • Функция обратного вызова может использоваться для запуска событий, изменения состояния игры или начала анимации.

Сравнение статических тел и сенсоров

Свойство Статическое тело Сенсор
Движение Нет Нет
Влияние на другие тела Да, вызывает столкновения Нет, только обнаруживает пересечение
Гравитация Не влияет Не влияет
Основное применение Платформы, стены, границы Триггеры, зоны событий, детекторы

Практические советы

  1. Комбинирование: статические платформы можно сочетать с сенсорами для создания интерактивного уровня. Например, платформа фиксированная, а сенсор под ней — триггер активации ловушки.
  2. Оптимизация: статические тела более производительные, чем динамические, так как движок не рассчитывает их движение. Сенсоры также лёгкие, поскольку не требуют реакции столкновений.
  3. Точные размеры: всегда настраивать setSize() и setOffset(), чтобы физическое тело точно совпадало с визуальной графикой.
  4. Группы: использование staticGroup или physics.add.group({immovable: true}) упрощает создание множества статических объектов и сенсоров.

Интеграция с событиями игры

Статические тела и сенсоры позволяют строить сложные механики:

  • Зоны сохранения прогресса: сенсор фиксирует вход игрока в область.
  • Ловушки и преграды: статические тела блокируют движение, сенсоры запускают урон.
  • Динамическая генерация уровня: можно создавать новые статические платформы и сенсоры во время игры без перерасчёта физики для остальных объектов.

Использование этих инструментов обеспечивает баланс между производительностью, контролем над объектами и интерактивностью игрового мира в Phaser.