InputManager и InputPlugin сцены

В Phaser 3 управление вводом пользователя реализовано через два ключевых компонента: InputManager и InputPlugin. Они обеспечивают обработку событий мыши, касаний, клавиатуры и других устройств ввода, создавая единый интерфейс для взаимодействия с объектами сцены.


InputManager

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

Основные функции InputManager:

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

Ключевые свойства:

  • scene — ссылка на текущую сцену.
  • enabled — включает или отключает обработку ввода для сцены.
  • events — объект событий, через который можно подписаться на глобальные события ввода (pointerdown, pointerup, pointermove и т.д.).
  • pointers — массив всех указателей (мышь, касания).
  • activePointer — текущий основной указатель, обычно первый касание или курсор мыши.

Пример использования InputManager для глобального события:

this.input.manager.on('pointerdown', function (pointer) {
    console.log('Нажатие по экрану:', pointer.x, pointer.y);
});

InputPlugin

Каждая сцена в Phaser получает InputPlugin как свойство this.input. Этот плагин является интерфейсом к InputManager, предоставляя удобные методы для настройки взаимодействия с игровыми объектами.

Основные возможности InputPlugin:

  • Привязка событий ввода к конкретным объектам: спрайтам, зонам, тайлмапам.
  • Настройка интерактивности объектов.
  • Создание жестов (drag, swipe, pinch).
  • Поддержка кастомных коллайдеров ввода.

Ключевые методы InputPlugin:

  • setDraggable(gameObject) — делает объект перетаскиваемым.
  • enable(gameObject) — активирует интерактивность для объекта.
  • disable(gameObject) — отключает интерактивность.
  • on(event, callback, context) — привязка событий к объекту.

Пример привязки клика к спрайту:

let sprite = this.add.sprite(400, 300, 'player');

sprite.setInteractive();
sprite.on('pointerdown', function (pointer) {
    console.log('Спрайт нажат!');
});

Пример перетаскивания объекта:

this.input.setDraggable(sprite);

this.input.on('dragstart', function (pointer, gameObject) {
    console.log('Начало перетаскивания', gameObject);
});

this.input.on('drag', function (pointer, gameObject, dragX, dragY) {
    gameObject.x = dragX;
    gameObject.y = dragY;
});

this.input.on('dragend', function (pointer, gameObject) {
    console.log('Перетаскивание завершено', gameObject);
});

Работа с указателями (Pointers)

Phaser поддерживает несколько указателей одновременно. Каждый указатель представляет собой объект Pointer, содержащий информацию о позиции, состоянии кнопок и движении.

Свойства Pointer:

  • x, y — текущие координаты указателя.
  • isDown — состояние нажатия.
  • buttons — текущие активные кнопки мыши.
  • pointerId — уникальный идентификатор для мультитач.
  • velocity — скорость движения указателя.

События для указателей:

  • pointerdown — начало нажатия.
  • pointerup — отпускание.
  • pointermove — перемещение.
  • pointerover / pointerout — наведение и уход с объекта.
  • pointerenter / pointerleave — события при входе и выходе на интерактивный объект.

Интерактивные зоны и объекты

Зоны (Phaser.GameObjects.Zone) — невидимые объекты, которые могут реагировать на ввод. Используются для создания областей клика, drag-and-drop или сложных интерфейсов.

let zone = this.add.zone(200, 200, 100, 100);
zone.setInteractive();

zone.on('pointerdown', function () {
    console.log('Зона нажата!');
});

Поддержка коллайдеров ввода:

  • По умолчанию используется прямоугольник спрайта.
  • Можно задать кастомный hit area через setInteractive(shape, callback).
sprite.setInteractive(new Phaser.Geom.Circle(0, 0, 50), Phaser.Geom.Circle.Contains);

Настройка InputManager и InputPlugin

Включение/отключение ввода:

this.input.enabled = false; // Отключает все события ввода
this.input.enabled = true;  // Включает обработку ввода

Сброс событий указателя:

this.input.manager.reset(); // Сбрасывает все активные указатели и состояния

Управление мульти-тачем:

this.input.addPointer(3); // Создает 3 дополнительных указателя

Фильтрация объектов для ввода:

Можно настроить, какие объекты сцены будут реагировать на ввод через input.hitAreaCallback.


Событийная модель Phaser Input

InputManager и InputPlugin работают через событийную модель. События могут быть:

  • Глобальными (InputManager) — отлавливаются для всей сцены.
  • Локальными (InputPlugin) — привязаны к конкретным объектам.

Последовательность обработки:

  1. Указатель получает событие.
  2. InputManager определяет, какие объекты находятся под указателем.
  3. Событие направляется к интерактивным объектам.
  4. Callback объекта вызывается в контексте события.

Пример глобального и локального события:

// Глобальное событие сцены
this.input.manager.on('pointerup', function (pointer) {
    console.log('Глобальное отпускание', pointer.x, pointer.y);
});

// Локальное событие спрайта
sprite.on('pointerup', function () {
    console.log('Спрайт отпущен');
});

Интеграция с другими системами сцены

InputPlugin тесно интегрирован с анимациями, тайлмапами и контейнерами:

  • Контейнеры: интерактивность распространяется на все дочерние объекты.
  • Анимации: можно отключать ввод на время проигрывания.
  • Тайлмапы: поддержка кликов по отдельным тайлам через setInteractive для слоев.
layer.setInteractive();
layer.on('pointerdown', function (pointer, localX, localY) {
    console.log('Тайл нажат в координатах', localX, localY);
});

Резюме ключевых моментов

  • InputManager управляет всеми указателями и источниками ввода в сцене.
  • InputPlugin обеспечивает удобный интерфейс для объектов и событий сцены.
  • Поддерживаются мышь, клавиатура, мультитач, жесты и кастомные коллайдеры.
  • Интерактивные объекты и зоны позволяют гибко создавать интерфейсы и игровые механики.
  • События могут быть глобальными и локальными, что обеспечивает точный контроль над обработкой ввода.

Эти компоненты формируют фундаментальную систему взаимодействия пользователя с игрой в Phaser, обеспечивая высокую гибкость и масштабируемость для любых игровых проектов.