В Paper.js объекты на холсте могут быть сгруппированы с помощью
класса Group. Это позволяет объединять несколько элементов
в один логический блок, управлять ими как единым объектом, перемещать,
трансформировать и изменять их свойства одновременно.
Группу можно создать двумя способами:
var circle = new Path.Circle({
center: [50, 50],
radius: 30,
fillColor: 'red'
});
var rectangle = new Path.Rectangle({
point: [70, 70],
size: [60, 40],
fillColor: 'blue'
});
var group = new Group([circle, rectangle]);
В этом примере circle и rectangle
становятся частью одной группы. Любое перемещение
group.position смещает оба объекта одновременно.
var group = new Group();
group.addChild(circle);
group.addChild(rectangle);
Метод addChild добавляет элемент в группу, сохраняя его
относительное положение.
position – координаты центра группы.
Изменение сдвигает все дочерние объекты.bounds – прямоугольная область,
охватывающая все элементы группы.children – массив всех элементов
внутри группы.visible – управляет видимостью всех
объектов в группе одновременно.opacity – задаёт прозрачность для всей
группы.group.position = new Point(200, 200);
group.opacity = 0.5;
group.visible = true;
Группы могут содержать другие группы, создавая иерархическую структуру:
var innerGroup = new Group([circle]);
var outerGroup = new Group([innerGroup, rectangle]);
Любое действие над outerGroup влияет на
innerGroup и все его дочерние элементы. При этом дочерние
группы сохраняют свои локальные координаты относительно родительской
группы.
Группы наследуют методы трансформации от объектов Paper.js:
translate(offset) – перемещает группу
на заданное смещение.rotate(angle, center) – вращает группу
вокруг указанной точки.scale(factor, center) – масштабирует
группу по оси или в целом.remove() – удаляет группу и все её
дочерние элементы с холста.group.rotate(45); // Поворот на 45 градусов
group.scale(1.5); // Увеличение размера группы на 50%
group.translate([100, 50]); // Смещение группы
var firstChild = group.children[0];
firstChild.fillColor = 'green';
group.removeChild(rectangle);
console.log(group.children.length);
Внутри группы каждый объект имеет локальные координаты, которые зависят от позиции родительской группы. Перемещение группы не меняет локальные координаты объектов, но изменяет их мировые координаты на холсте.
console.log(circle.position); // Локальная позиция относительно группы
console.log(circle.globalToLocal(new Point(200, 200))); // Преобразование в локальные координаты
opacity,
blendMode и visible, влияют на все дочерние
объекты.События мыши и клика могут быть назначены на группы:
group.onCl ick = function(event) {
this.scale(1.2);
};
При этом событие срабатывает при клике на любой дочерний элемент
группы. Для определения конкретного объекта используется
event.target.
Группы особенно полезны для анимации, так как позволяют изменять положение, масштаб или вращение множества объектов одновременно:
function onFrame(event) {
group.rotate(1); // Плавное вращение группы
group.position.x += 2; // Смещение вправо
}
Группы в Paper.js являются мощным инструментом для управления множеством объектов, упрощения анимации и организации сцены. Они создают логическую структуру и обеспечивают согласованное поведение всех элементов внутри.