Phaser предоставляет мощный и гибкий механизм для обработки
нескольких указателей одновременно. Это особенно важно для мобильных
устройств, где взаимодействие часто осуществляется через сенсорный экран
с несколькими пальцами. В Phaser каждый указатель представлен объектом
Pointer, который хранит состояние касания, координаты,
скорость движения и дополнительную информацию.
Основной объект для управления вводом — это this.input,
который содержит коллекцию всех активных указателей
(this.input.pointers) и события для их обработки. По
умолчанию Phaser отслеживает один основной указатель
(pointer1), но при настройке мультитача можно активировать
поддержку нескольких пальцев.
this.input.addPointer(3); // добавляет 3 дополнительных указателя, всего 4
После этого в игре будут доступны указатели pointer1,
pointer2, pointer3 и pointer4.
Каждый указатель можно использовать независимо для отслеживания нажатий,
движений и отпусканий.
Phaser позволяет подписываться на события для каждого указателя через глобальные события ввода или через конкретные объекты. Основные события:
pointerdown — срабатывает при начале касания.pointerup — срабатывает при отпускании.pointermove — срабатывает при движении указателя.pointerover / pointerout — срабатывают при
наведении и уходе указателя с объекта.Пример обработки нескольких касаний на спрайте:
let sprite = this.add.sprite(400, 300, 'button');
sprite.setInteractive();
sprite.on('pointerdown', (pointer) => {
console.log(`Указатель ${pointer.id} нажал на спрайт`);
});
sprite.on('pointerup', (pointer) => {
console.log(`Указатель ${pointer.id} отпустил спрайт`);
});
Каждый объект pointer содержит уникальный идентификатор
pointer.id, который позволяет различать касания. Для
мультитач-сценариев это критически важно, чтобы определить, какой палец
взаимодействует с каким элементом интерфейса.
Объект Pointer предоставляет множество свойств для
точного отслеживания касаний:
x, y — текущие координаты указателя.downX, downY — координаты точки начала
касания.isDown — булевое значение, показывающее, удерживается
ли палец.velocity — скорость движения указателя, полезно для
жестов.tapCount — количество быстрых нажатий (для двойного
касания).Для мультитача важно проверять isDown у каждого
указателя, чтобы корректно обрабатывать одновременные касания.
Phaser позволяет реализовать жесты с несколькими пальцами, например:
Пример реализации простого масштабирования спрайта двумя пальцами:
let initialDistance = 0;
let sprite = this.add.sprite(400, 300, 'image');
this.input.on('pointermove', (pointer) => {
if (this.input.pointers[0].isDown && this.input.pointers[1].isDown) {
let dx = this.input.pointers[0].x - this.input.pointers[1].x;
let dy = this.input.pointers[0].y - this.input.pointers[1].y;
let distance = Math.sqrt(dx * dx + dy * dy);
if (initialDistance === 0) {
initialDistance = distance;
} else {
let scale = distance / initialDistance;
sprite.setScale(scale);
}
}
});
this.input.on('pointerup', () => {
initialDistance = 0;
});
В сложных сценах с множеством интерактивных объектов важно правильно распределять приоритеты обработки касаний. Phaser предоставляет несколько стратегий:
depth получают приоритет при обработке касаний.sprite.setInteractive({ useHandCursor: true, draggable: true });
Опция draggable позволяет использовать указатели для
перетаскивания объектов, автоматически учитывая мультитач.
addPointer.pointer.id.isDown и velocity для
реализации сложных жестов.Мощь мультитача в Phaser открывает возможности создавать интуитивно понятные интерфейсы, сложные жесты и интерактивные сцены, которые корректно работают как на десктопе с мышью, так и на мобильных устройствах с сенсорным экраном.