В Phaser 3 управление вводом пользователя реализовано через два ключевых компонента: InputManager и InputPlugin. Они обеспечивают обработку событий мыши, касаний, клавиатуры и других устройств ввода, создавая единый интерфейс для взаимодействия с объектами сцены.
InputManager — это центральный компонент движка, который управляет всеми источниками ввода в игре. Он создается автоматически для каждой сцены и координирует работу различных плагинов ввода.
Основные функции InputManager:
Ключевые свойства:
scene — ссылка на текущую сцену.enabled — включает или отключает обработку ввода для
сцены.events — объект событий, через который можно
подписаться на глобальные события ввода (pointerdown,
pointerup, pointermove и т.д.).pointers — массив всех указателей (мышь, касания).activePointer — текущий основной указатель, обычно
первый касание или курсор мыши.Пример использования InputManager для глобального события:
this.input.manager.on('pointerdown', function (pointer) {
console.log('Нажатие по экрану:', pointer.x, pointer.y);
});
Каждая сцена в Phaser получает InputPlugin как
свойство this.input. Этот плагин является интерфейсом к
InputManager, предоставляя удобные методы для настройки взаимодействия с
игровыми объектами.
Основные возможности InputPlugin:
Ключевые методы 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);
});
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('Зона нажата!');
});
Поддержка коллайдеров ввода:
setInteractive(shape, callback).sprite.setInteractive(new Phaser.Geom.Circle(0, 0, 50), Phaser.Geom.Circle.Contains);
Включение/отключение ввода:
this.input.enabled = false; // Отключает все события ввода
this.input.enabled = true; // Включает обработку ввода
Сброс событий указателя:
this.input.manager.reset(); // Сбрасывает все активные указатели и состояния
Управление мульти-тачем:
this.input.addPointer(3); // Создает 3 дополнительных указателя
Фильтрация объектов для ввода:
Можно настроить, какие объекты сцены будут реагировать на ввод через
input.hitAreaCallback.
InputManager и InputPlugin работают через событийную модель. События могут быть:
Последовательность обработки:
Пример глобального и локального события:
// Глобальное событие сцены
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);
});
Эти компоненты формируют фундаментальную систему взаимодействия пользователя с игрой в Phaser, обеспечивая высокую гибкость и масштабируемость для любых игровых проектов.