Two.js — это мощная библиотека для работы с двумерной графикой в браузере. Одним из ключевых инструментов для управления динамическими объектами является использование Hooks. Hooks в Two.js позволяют подключать функции обратного вызова к различным событиям жизненного цикла объектов и анимаций, что даёт высокий контроль над визуальными элементами.
Создание экземпляра Two.js и привязка его к DOM-элементу выполняется следующим образом:
const elem = document.getElementById('draw');
const params = { width: 800, height: 600 };
const two = new Two(params).appendTo(elem);
После инициализации можно создавать фигуры и применять к ним Hooks для управления их поведением.
Two.js предоставляет несколько категорий Hooks:
update – вызывается на каждом кадре
анимации перед рендерингом.render – вызывается после завершения
всех обновлений объектов, перед выводом на экран.remove – срабатывает при удалении
объекта из сцены.change – отслеживает изменения свойств
объекта (например, позиции, цвета, размера).updateHook update — самый часто используемый, он позволяет
выполнять операции на каждом кадре анимации. Основное преимущество —
синхронизация логики с рендерингом без необходимости вручную вызывать
two.update().
Пример использования:
const circle = two.makeCircle(400, 300, 50);
circle.fill = '#ff8000';
circle.noStroke();
two.bind('update', function(frameCount, deltaTime) {
circle.rotation += 0.01;
circle.translation.x = 400 + 100 * Math.sin(frameCount * 0.05);
});
two.play();
Здесь frameCount — количество кадров с начала анимации,
а deltaTime — время в миллисекундах между кадрами.
Использование этих параметров позволяет реализовать плавные и
предсказуемые анимации.
renderHook render вызывается после всех обновлений
объектов, что удобно для финальной коррекции визуальных свойств
перед рендером:
two.bind('render', function() {
circle.opacity = Math.abs(Math.sin(two.frameCount * 0.05));
});
render позволяет реализовать эффекты, которые зависят от
окончательного состояния сцены, например, пульсацию, мерцание
или наложение фильтров.
changeHook change реагирует на модификации свойств объектов.
Он полезен для динамического связывания объектов, когда
изменение одного элемента должно вызывать корректировку другого.
const rect = two.makeRectangle(200, 300, 100, 50);
rect.fill = '#0080ff';
rect.noStroke();
rect.bind('change', function() {
circle.translation.y = rect.translation.y + 100;
});
Каждое изменение свойства rect.translation.y
автоматически обновляет позицию связанного круга. Hook
change делает Two.js реактивной системой,
аналогичной подходам в современных фреймворках.
removeHook remove позволяет выполнять действия при удалении
объектов из сцены, например, очистку ресурсов или анимацию
исчезновения:
circle.bind('remove', function() {
console.log('Круг удалён из сцены');
});
setTimeout(() => two.remove(circle), 3000);
Удаление через two.remove(object) гарантирует вызов всех
связанных Hook-ов и корректное управление памятью.
Hooks можно использовать совместно для создания сложных интерактивных сцен. Пример:
two.bind('update', function(frameCount) {
rect.rotation += 0.02;
});
rect.bind('change', function() {
circle.translation.x = rect.translation.x + Math.cos(rect.rotation) * 50;
});
two.bind('render', function() {
circle.opacity = 0.5 + 0.5 * Math.sin(two.frameCount * 0.1);
});
В этом примере update отвечает за анимацию
прямоугольника, change синхронизирует движение круга, а
render создаёт плавное мерцание. Такой подход обеспечивает
чистое разделение логики анимации и визуальных
эффектов.
update только для динамических
изменений, а статические корректировки применять один раз при
инициализации.unbind:two.unbind('update', updateFunction);
circle.unbind('change');
Использование Hooks в Two.js превращает библиотеку в гибкую и мощную систему анимации, где каждый объект может реагировать на изменения сцены, взаимодействовать с другими элементами и автоматически синхронизироваться с циклом рендеринга. Такой подход обеспечивает высокую производительность и удобство управления сложными сценами.