В Paper.js символы (Symbol) представляют собой
повторно используемые графические объекты, которые позволяют
оптимизировать производительность при работе с множеством одинаковых
элементов на сцене. Символы создаются на основе уже существующих
объектов Paper.js, таких как Path, Raster,
Group, и позволяют многократно использовать их экземпляры
без необходимости дублирования исходных данных.
Для создания символа используется конструктор
new Symbol(item), где item — это объект
Paper.js, который станет основой символа. После создания символа
исходный объект может быть удалён или скрыт, не влияя на символ.
// Создание объекта Path
var path = new Path.Circle({
center: [50, 50],
radius: 20,
fillColor: 'red'
});
// Создание символа на основе Path
var symbol = new Symbol(path);
В этом примере объект path превращается в символ
symbol. Теперь можно создавать его экземпляры на сцене.
После создания символа экземпляры добавляются с помощью метода
symbol.place([point]). Экземпляр символа — это объект
PlacedSymbol, который ведет себя как любой другой объект
Paper.js, но при этом связан с оригинальным символом.
// Размещение экземпляров символа
var placed1 = symbol.place(new Point(100, 100));
var placed2 = symbol.place(new Point(200, 100));
// Настройка цвета через экземпляр
placed2.fillColor = 'blue';
Особенности PlacedSymbol:
С помощью Symbol API можно получать доступ к различным аспектам символов:
symbol.definition — исходный объект, на основе которого
создан символ.symbol.place() — создание нового экземпляра
символа.symbol.remove() — удаление символа и всех его
экземпляров.placedSymbol.remove() — удаление отдельного
экземпляра.// Удаление символа и всех экземпляров
symbol.remove();
// Удаление одного экземпляра
placed1.remove();
Экземпляры символов поддерживают все стандартные трансформации объектов Paper.js:
position или
translate()scale()rotate()scale(-1, 1) или
scale(1, -1)placed2.scale(1.5);
placed2.rotate(45);
placed2.position = new Point(250, 150);
Каждая трансформация применяется только к конкретному экземпляру, не влияя на исходный символ или другие экземпляры.
Symbols удобны для создания анимаций, так как изменение исходного
объекта автоматически обновляет все экземпляры, если используется метод
symbol.definition. Однако, часто для динамических сцен
проще анимировать отдельные экземпляры.
function onFrame(event) {
placed1.rotate(2);
placed2.position.x += 1;
}
Экземпляры символов могут использоваться как части сложных анимационных эффектов, например, для генерации визуализаций частиц или повторяющихся элементов интерфейса.
symbol.definition.symbol.definition.fillColor = 'green';
Все существующие экземпляры обновятся автоматически, если не имеют индивидуально переопределенных свойств.
Символ может быть создан не только из одного Path или
Raster, но и из группы объектов (Group). Это
позволяет объединять несколько объектов в один символ и затем
многократно размещать его на сцене.
var group = new Group([
new Path.Circle({center: [0,0], radius: 20, fillColor: 'yellow'}),
new Path.Rectangle({point: [-10, -10], size: [20,20], fillColor: 'blue'})
]);
var groupSymbol = new Symbol(group);
var instance = groupSymbol.place(new Point(300, 300));
Использование групповых символов особенно полезно для создания сложных графических элементов интерфейса, иконок или декоративных объектов, которые повторяются на сцене.