Для работы с курсорами и визуальной обратной связью в Two.js
необходимо создать экземпляр Two и настроить сцену. Two.js позволяет
работать с HTML <canvas>, <svg>
или WebGL-рендерером. Наиболее универсальным вариантом является
использование <canvas>.
const elem = document.getElementById('draw-shapes');
const params = { width: 800, height: 600 };
const two = new Two(params).appendTo(elem);
Здесь elem — контейнер для рендеринга,
params задают размеры области рисования. После создания
экземпляра Two можно сразу приступить к созданию графических
элементов.
Для визуальной обратной связи необходимо знать координаты мыши или
касания. В стандартном случае используются события
mousemove и mousedown:
let cursor = { x: 0, y: 0 };
elem.addEventListener('mousemove', (e) => {
const rect = elem.getBoundingClientRect();
cursor.x = e.clientX - rect.left;
cursor.y = e.clientY - rect.top;
});
Использование getBoundingClientRect() обеспечивает
корректные координаты относительно канваса, а не всей страницы. Эти
координаты можно применять для управления объектами Two.js.
Часто курсор отображают с помощью круга или другой геометрической фигуры:
const cursorCircle = two.makeCircle(cursor.x, cursor.y, 10);
cursorCircle.fill = '#ff0000';
cursorCircle.noStroke();
makeCircle создаёт объект с заданной позицией и
радиусом. Свойства fill и noStroke позволяют
настроить цвет и убрать обводку.
Для динамического обновления положения используется цикл рендеринга:
two.bind('upd ate', () => {
cursorCircle.translation.se t(cursor.x, cursor.y);
}).play();
translation.set перемещает объект на новые координаты
без пересоздания фигуры, что оптимально для производительности.
Two.js позволяет создавать плавные анимации с помощью интерполяции и Tween-эффектов. Например, можно добавить “след” за курсором:
const trail = [];
const maxTrail = 20;
two.bind('update', () => {
const dot = two.makeCircle(cursor.x, cursor.y, 5);
dot.fill = 'rgba(0, 0, 255, 0.5)';
dot.noStroke();
trail.push(dot);
if (trail.length > maxTrail) {
const oldDot = trail.shift();
two.remove(oldDot);
}
}).play();
Такой подход создаёт эффект движения курсора с постепенным
исчезновением старых точек. Регулируя maxTrail и
прозрачность, можно добиться нужной визуальной насыщенности.
Для наглядного подтверждения действий пользователя применяются всплывающие эффекты при клике:
elem.addEventListener('mousedown', () => {
const clickCircle = two.makeCircle(cursor.x, cursor.y, 20);
clickCircle.fill = 'rgba(255, 165, 0, 0.6)';
clickCircle.noStroke();
two.bind('update', function animateClick() {
clickCircle.scale *= 0.9;
clickCircle.opacity *= 0.9;
if (clickCircle.opacity < 0.05) {
two.remove(clickCircle);
two.unbind('update', animateClick);
}
});
});
Использование масштабирования и постепенного уменьшения прозрачности создаёт визуально привлекательный эффект “всплеска”.
Two.js поддерживает создание групп и слоёв для управления визуальными объектами:
const cursorLayer = two.makeGroup(cursorCircle);
const trailLayer = two.makeGroup();
Группы позволяют управлять всеми объектами одновременно: менять прозрачность, смещать или скрывать, что удобно для сложных интерфейсов с множеством элементов обратной связи.
Можно комбинировать визуальные эффекты курсора с клавиатурными событиями для расширенной интерактивности:
window.addEventListener('keydown', (e) => {
if (e.key === 'Shift') {
cursorCircle.fill = '#00ff00';
}
});
window.addEventListener('keyup', (e) => {
if (e.key === 'Shift') {
cursorCircle.fill = '#ff0000';
}
});
Таким образом, изменение состояния клавиш напрямую отражается на визуальной части, что позволяет создавать динамичные интерфейсы с мгновенной обратной связью.
bind('update') для плавной анимации и
интерполяции координат.mousemove на
touchmove и корректно рассчитывать координаты относительно
контейнера.Эти техники позволяют создавать интерактивные интерфейсы с мгновенной визуальной обратной связью, используя возможности Two.js для динамичного и привлекательного отображения движения курсора.