Paper.js предоставляет удобный механизм для работы с графикой через концепцию scope — области видимости, в которой создаются и управляются объекты графики. Автоматический scope позволяет работать с элементами холста без явного создания экземпляров проекта, что упрощает управление сценой и снижает объем кода.
Когда скрипт Paper.js подключен к HTML-документу и не создается явный
объект PaperScope, библиотека автоматически создает
глобальный scope. Все объекты, включая
Path, Point, Group и другие,
создаются в этом scope. Это означает, что переменные типа:
var circle = new Path.Circle(new Point(100, 100), 50);
circle.fillColor = 'red';
будут автоматически добавлены в текущий активный проект без
необходимости указывать
project.activeLayer.addChild(circle).
Ключевой момент: автоматический scope работает
только после вызова paper.setup(canvas), где
canvas — элемент <canvas> в документе.
Без инициализации холста scope не будет корректно создан.
var canvas = document.getElementById('myCanvas');
paper.setup(canvas);
После вызова setup можно создавать любые объекты
графики, и они будут автоматически добавлены на слой проекта.
Каждый scope содержит один или несколько проектов
(Project). По умолчанию создается активный
проект (project), на который направляются все
команды при работе в автоматическом scope. Проект хранит свои слои,
элементы и состояния, обеспечивая изоляцию объектов:
Пример создания нескольких элементов в автоматическом scope:
var rect = new Path.Rectangle(new Point(50, 50), new Size(100, 80));
rect.strokeColor = 'blue';
var circle = new Path.Circle(new Point(200, 200), 60);
circle.fillColor = 'green';
Все объекты автоматически добавляются в
project.activeLayer.
В крупных приложениях может понадобиться управление несколькими scope
одновременно. Paper.js позволяет создавать дополнительные scope через
new PaperScope(), но автоматический scope предоставляет
удобную альтернативу для простых и средних задач. Важно понимать,
что:
Path, Point,
Color) в автоматическом scope относятся к текущему
активному проекту.project.activate()
перенаправляет все последующие команды в новый scope.Пример:
var anotherScope = new paper.PaperScope();
anotherScope.setup(document.getElementById('canvas2'));
// Активируем новый проект
anotherScope.project.activate();
var line = new anotherScope.Path.Line(new anotherScope.Point(10, 10), new anotherScope.Point(100, 100));
line.strokeColor = 'orange';
PaperScope.<canvas> без дополнительных настроек.view.onFrame, view.onMouseMove и другим
событиям осуществляется без явного указания scope.Автоматический scope позволяет подключать обработчики событий к
view проекта напрямую:
view.onFr ame = function(event) {
circle.rotate(1); // Поворот объекта каждый кадр
};
view.onMouseM ove = function(event) {
rect.position = event.point; // Следуем за курсором
};
Эти события автоматически привязаны к активному проекту и его слоям, что делает код компактным и логически структурированным.
Хотя автоматический scope удобен, иногда необходимо изолировать
объекты. Для этого используют Group:
var group = new Group([rect, circle]);
group.position = new Point(300, 300);
Все элементы внутри группы сохраняют относительные координаты и свойства, при этом остаются в автоматическом scope, но управляются как единое целое.
Paper.js поддерживает автоматическое применение свойств объектов в scope:
circle.fillColor = 'purple';
circle.strokeColor = 'yellow';
circle.strokeWidth = 5;
Эти свойства применяются немедленно, и изменения отображаются в
view без дополнительного рендеринга.
Автоматический scope упрощает применение трансформаций:
Пример анимации в автоматическом scope:
view.onFr ame = function(event) {
group.rotate(0.5);
group.scale(1 + 0.001 * Math.sin(event.count / 10));
};
Все изменения применяются к объектам без необходимости явно ссылаться на scope или слой.
Автоматический scope в Paper.js обеспечивает:
Такой подход идеально подходит для интерактивной графики, прототипирования и учебных проектов, где важно минимизировать количество boilerplate-кода и сосредоточиться на визуальных элементах.