Отключение ввода для объекта и сцены

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


Управление вводом на уровне объекта

Каждый интерактивный объект в Phaser может обрабатывать события ввода через методы setInteractive() и слушатели событий, такие как pointerdown, pointerover и другие. Чтобы отключить ввод для объекта:

sprite.disableInteractive();
  • disableInteractive() — снимает интерактивность с объекта, прекращая обработку всех событий указателя.
  • Объект остается видимым и активным в сцене, но клики и касания больше не будут вызывать обработчики событий.

Для повторного включения интерактивности используется:

sprite.setInteractive();

Важно понимать, что disableInteractive() не отключает физическое взаимодействие объекта с коллизиями, оно влияет исключительно на ввод пользователя.


Отключение ввода для группы объектов

Для группы объектов или контейнера удобно использовать цикл:

group.getChildren().forEach(child => {
    child.disableInteractive();
});

Если объекты добавлены в контейнер Container, отключение интерактивности контейнера не влияет автоматически на его дочерние элементы. Необходимо применять disableInteractive() к каждому объекту отдельно.


Полная блокировка ввода сцены

Phaser хранит менеджер ввода сцены в this.input. Отключение всех событий ввода можно выполнить через:

this.input.enabled = false;
  • Устанавливая enabled в false, блокируются все события мыши и касаний для текущей сцены.
  • При этом клавиатура и другие плагины ввода также перестают реагировать на события, если они связаны с менеджером сцены.

Для восстановления работы:

this.input.enabled = true;

Отключение определённых типов ввода

Phaser позволяет контролировать ввод по конкретным устройствам. Например, отключение только мыши или касания:

this.input.mouse.enabled = false;
this.input.touch.enabled = false;
  • this.input.mouse.enabled — блокирует события мыши.
  • this.input.touch.enabled — блокирует касания на сенсорных устройствах.
  • Остальные устройства ввода, такие как клавиатура, продолжают работать.

Примеры использования

1. Блокировка объекта на время анимации:

sprite.disableInteractive();
this.tweens.add({
    targets: sprite,
    x: 400,
    duration: 1000,
    onComplete: () => {
        sprite.setInteractive();
    }
});

2. Временная пауза всей сцены с блокировкой ввода:

this.input.enabled = false;
this.time.delayedCall(2000, () => {
    this.input.enabled = true;
});

3. Игнорирование касаний на мобильных устройствах:

this.input.touch.enabled = false;

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

  1. При использовании контейнеров отключение интерактивности контейнера не распространяется на дочерние объекты автоматически.
  2. События, подписанные напрямую на объект через on, перестают вызываться при disableInteractive().
  3. Менеджер ввода сцены блокирует ввод глобально, но не останавливает таймеры, анимации или физику.
  4. Порядок включения/отключения имеет значение: включение интерактивности объекта после отключения менеджера ввода сцены не сделает его кликабельным до включения this.input.enabled.

Рекомендации по организации кода

  • Использовать disableInteractive() для избирательной блокировки отдельных объектов.
  • Для глобальной паузы сцены применять this.input.enabled = false.
  • Для интерфейсных элементов, таких как кнопки, отдельно контролировать их интерактивность, чтобы не зависеть от общей сцены.
  • Создавать функции-обёртки для включения/отключения интерактивности, чтобы код оставался читаемым и поддерживаемым:
function setObjectsInteractive(objects, state) {
    objects.forEach(obj => {
        state ? obj.setInteractive() : obj.disableInteractive();
    });
}

Такой подход упрощает управление большим количеством объектов и позволяет легко реализовать динамическое включение/отключение ввода в игровых сценах.