В Paper.js анимация реализуется через событие
onFrame, которое срабатывает на каждом кадре,
обеспечивая плавное обновление сцены. Этот механизм позволяет создавать
интерактивные и динамичные графические эффекты без прямого использования
requestAnimationFrame из чистого JavaScript.
onFrameОбработчик onFrame назначается глобально или для
конкретного объекта проекта Paper.js:
paper.view.onFr ame = function(event) {
// Код анимации
};
Аргумент event содержит полезные свойства:
event.count — количество кадров с начала анимации.event.delta — время в секундах, прошедшее с последнего
кадра.event.time — общее время, прошедшее с начала
анимации.Пример: плавное движение объекта по горизонтали с постоянной скоростью:
let circle = new Path.Circle(new Point(50, 100), 30);
circle.fillColor = 'red';
paper.view.onFr ame = function(event) {
circle.position.x += 100 * event.delta; // скорость 100 пикселей в секунду
};
Каждый кадр Paper.js выполняет следующие шаги:
onFrame, если она задана.Важное свойство: обновления происходят синхронно с частотой обновления дисплея, обычно 60 кадров в секунду, что обеспечивает плавность движения.
Использование event.delta позволяет адаптировать
анимацию к изменению частоты кадров, делая движение независимым
от FPS:
rectangle.position.y += speed * event.delta;
Здесь speed задаётся в пикселях в секунду, а
event.delta корректирует смещение в зависимости от
реального времени между кадрами.
Paper.js работает с объектом Point, что упрощает
вычисления для движения, столкновений и физических эффектов.
Пример движения по круговой траектории:
let center = view.center;
let radius = 100;
let angle = 0;
paper.view.onFr ame = function(event) {
angle += 1 * event.delta; // скорость изменения угла
circle.position = center + new Point({
length: radius,
angle: angle * 180 / Math.PI
});
};
Использование векторов и методов Point
позволяет легко создавать сложные траектории и реагировать на
столкновения с границами канваса.
Для одновременной анимации нескольких объектов удобно использовать массивы или группы:
let circles = [];
for (let i = 0; i < 5; i++) {
let c = new Path.Circle(new Point(50 + i*60, 100), 20);
c.fillColor = 'blue';
circles.push(c);
}
paper.view.onFr ame = function(event) {
circles.forEach((c, index) => {
c.position.y += (index + 1) * 30 * event.delta;
});
};
Группы объектов (Group) позволяют применять
трансформации ко всем элементам сразу, сохраняя иерархию и
централизованный контроль:
let group = new Group(circles);
group.rotate(1); // вращение всей группы на каждом кадре
Для плавной анимации свойств объектов можно использовать интерполяцию:
circle.position = circle.position + (targetPosition - circle.position) * 0.05;
Этот метод обеспечивает плавное приближение к целевой позиции, создавая эффект «инерции».
onFrame подходит не только для перемещения объектов.
Можно анимировать цвета, толщину линий, масштаб и
прозрачность:
circle.fillColor.hue += 1; // циклическое изменение цвета
circle.opacity = 0.5 + 0.5 * Math.sin(event.count * 0.1); // пульсация прозрачности
onFrame,
чтобы избежать утечек памяти.event.delta для корректировки
скорости при разной частоте кадров.Событие onFrame в Paper.js является основой
циклической анимации, позволяя:
Правильное применение onFrame и методов работы с
объектами делает Paper.js мощным инструментом для интерактивной графики
и визуализации динамических эффектов.