В PixiJS интерактивность элементов управляется через свойство
eventMode, которое заменяет устаревшие методы
interactive и buttonMode в последних версиях
библиотеки. Правильное использование eventMode позволяет
точно контролировать реакции спрайтов, графических объектов и
контейнеров на события мыши и касаний.
eventMode и их значенияСвойство eventMode определяет, как объект обрабатывает
события ввода:
"none" — объект не реагирует на
события. Это значение по умолчанию для большинства графических
объектов."passive" — объект реагирует на
события, но не блокирует события на родительских элементах. Полезно для
визуальных эффектов, когда нужно прослушивать события, но не вмешиваться
в обработку выше."static" — объект может получать
события, но не меняет курсор мыши."dynamic" — объект полностью
интерактивен, включая изменение курсора при наведении. Используется для
кнопок и кликабельных элементов.Пример установки eventMode для спрайта:
const sprite = new PIXI.Sprite(texture);
sprite.eventMode = "dynamic";
sprite.cursor = "pointer";
Для интерактивных объектов используются стандартные события:
pointerdown — нажатие на объект (мышь
или касание).pointerup — отпускание кнопки.pointerupoutside — отпускание вне
границ объекта.pointermove — перемещение указателя
над объектом.pointerover / pointerout
— наведение и уход курсора.Пример назначения событий:
sprite.on("pointerdown", (event) => {
console.log("Спрайт нажат", event);
});
sprite.on("pointerover", () => {
sprite.tint = 0xff0000; // изменение цвета при наведении
});
sprite.on("pointerout", () => {
sprite.tint = 0xffffff; // возврат цвета
});
interactiveChildren для контейнеровКонтейнеры в PixiJS могут содержать несколько объектов. Свойство
interactiveChildren определяет, будут ли
дочерние элементы реагировать на события:
true — события обрабатываются
дочерними объектами.false — только сам контейнер реагирует
на события, дочерние объекты игнорируются.Пример:
const container = new PIXI.Container();
container.eventMode = "dynamic";
container.interactiveChildren = true;
const child = new PIXI.Sprite(texture);
child.eventMode = "dynamic";
container.addChild(child);
При наведении или клике на child события будут корректно
обработаны.
cursorСвойство cursor работает только с
объектами, у которых eventMode установлен в
"dynamic". Оно позволяет менять вид курсора при
наведении:
sprite.cursor = "pointer"; // стандартная рука
sprite.cursor = "grab"; // для перетаскиваемых объектов
Курсор изменяется автоматически при наведении на объект.
Графические примитивы (PIXI.Graphics) также могут быть
интерактивными. Чтобы обработка событий работала корректно, нужно
учитывать область, определяемую графикой. Если фигура
не закрыта (например, только линия), событие может не срабатывать, так
как PixiJS использует hit test по заполненной области.
Пример интерактивного прямоугольника:
const rect = new PIXI.Graphics();
rect.beginFill(0x00ff00);
rect.drawRect(0, 0, 100, 50);
rect.endFill();
rect.eventMode = "dynamic";
rect.cursor = "pointer";
rect.on("pointerdown", () => {
rect.alpha = 0.5;
});
"dynamic", если
интерактивность нужна только на части сцены.interactiveChildren, если
дочерние элементы не требуют событий.eventMode: "passive" для
объектов, реагирующих только на визуальные изменения, чтобы
минимизировать нагрузку.eventMode согласно требованиям..on(...).interactiveChildren.Использование eventMode в PixiJS упрощает управление
интерактивностью и делает код более читаемым, устраняя устаревшие методы
interactive и buttonMode.