В PixiJS FederatedPointerEvent представляет собой единый
механизм работы с указателями (мышь, касания, стилус) внутри сцены. Он
объединяет обработку событий ввода и обеспечивает совместимость с
различными устройствами. Этот объект расширяет возможности стандартного
DOM-события, предлагая специфические свойства и методы для работы в
контексте графического рендеринга.
type — тип события
(pointerdown, pointerup,
pointermove, pointerover,
pointerout и другие). Используется для определения, какое
действие совершил пользователь.target — ссылка на объект
DisplayObject, на котором произошло событие. Позволяет
напрямую взаимодействовать с элементом сцены.currentTarget — объект, который в
данный момент обрабатывает событие, часто совпадает с
target, но может отличаться при всплытии событий.pointerId — уникальный идентификатор
указателя, полезен при работе с мультитач.pointerType — тип устройства
(mouse, touch, pen). Позволяет
адаптировать обработку ввода под разные источники.buttons — состояние кнопок мыши в
момент события, числовое значение согласно стандарту DOM.isPrimary — булево значение,
указывающее, является ли указатель основным (например, первый палец при
касании).pressure — сила нажатия для устройств
с поддержкой давления (стилус, сенсорные панели).width и height — размеры
контактной области указателя при касании, полезны для реалистичной
обработки touch-событий.tiltX и tiltY — угол
наклона стилуса по осям X и Y.twist — вращение стилуса относительно
его оси.global — объект Point,
содержащий координаты события в глобальной системе сцены.local — объект Point,
содержащий координаты события в локальной системе координат
target. Метод getLocalPosition(target)
позволяет вычислять локальные координаты для произвольного объекта
сцены.stopPropagation() — предотвращает
дальнейшее распространение события по иерархии объектов.stopImmediatePropagation() — полностью
блокирует обработку события другими слушателями, включая текущий
уровень.getLocalPosition(displayObject) —
возвращает координаты события относительно указанного объекта. Внутри
можно передавать любые объекты сцены (Container,
Sprite, Graphics) для получения корректного
позиционирования.preventDefault() — блокирует
стандартное поведение браузера, например, прокрутку страницы при касании
на мобильных устройствах.Всплытие и захват
FederatedPointerEvent поддерживает модель всплытия событий,
аналогичную DOM: событие сначала создается на целевом объекте, затем
поднимается вверх по иерархии Container. Свойства
target и currentTarget помогают различать
исходный объект и текущий обработчик.
Мультитач и множественные указатели
Использование pointerId позволяет одновременно отслеживать
несколько касаний или нажатий. Например, для реализации жестов
pinch-to-zoom или multi-button drag достаточно хранить состояние каждого
указателя отдельно.
Поддержка различных устройств ввода
pointerType дает возможность адаптировать логику обработки:
рисование стилусом, управление мышью или касанием пальца, с учётом
особенностей каждого устройства, таких как pressure,
tiltX и tiltY.
Конвертация координат Одной из ключевых задач
при работе с FederatedPointerEvent является преобразование
глобальных координат в локальные. Для этого используется метод
getLocalPosition, который учитывает трансформации объектов
сцены, их масштаб и вращение. Без этого рисование или взаимодействие
объектов может быть неточным.
Интерактивные спрайты Создание кнопок или объектов, реагирующих на нажатия, с учётом мультитач:
sprite.on('pointerdown', (event) => {
const localPos = event.getLocalPosition(sprite);
console.log('Координаты на спрайте:', localPos.x, localPos.y);
});Рисование стилусом Использование
pressure, tiltX, tiltY для
динамического изменения толщины линии:
graphics.lineStyle(event.pressure * 10, 0x000000);
graphics.moveTo(lastX, lastY);
graphics.lineTo(event.global.x, event.global.y);Жесты мультитач Сохранение позиции каждого
указателя по pointerId позволяет вычислять масштаб и
вращение между двумя пальцами.
Фильтрация по типу устройства Для улучшения производительности можно обрабатывать только нужные типы указателей:
if (event.pointerType !== 'touch') return;Минимизация вызова getLocalPosition
Поскольку вычисление локальных координат включает матричные
трансформации, его лучше вызывать только при необходимости, например,
при начале события pointerdown или
pointermove.
Управление всплытием Использование
stopPropagation() предотвращает лишнюю обработку в
родительских контейнерах и снижает нагрузку на сцену.
FederatedPointerEvent является универсальным
инструментом для интерактивной работы с элементами сцены в PixiJS,
обеспечивая единый подход к обработке всех видов указателей и позволяя
создавать сложные интерфейсы и графические приложения с мультитачем и
стилусом.