Paper.js предоставляет мощный механизм для работы с графическими
элементами через Item — базовый класс всех объектов на
холсте. Возможность создавать собственные классы, наследуемые от
Item, позволяет расширять функциональность, объединять
несколько элементов в один объект и создавать интерактивные компоненты с
уникальной логикой.
Для создания кастомного элемента используется стандартное прототипное наследование Jav * aScript:
var CustomItem = Item.extend({
initialize: function(position, size) {
Item.call(this); // вызов конструктора родителя
this.position = position;
this.size = size;
this._createShape();
},
_createShape: function() {
this.rect = new Path.Rectangle({
point: [this.position.x, this.position.y],
size: [this.size.width, this.size.height],
fillColor: 'lightblue'
});
},
setColor: function(color) {
this.rect.fillColor = color;
},
move: function(delta) {
this.position += delta;
this.rect.position += delta;
}
});
Ключевые моменты:
Item.call(this) — обязательный вызов конструктора
базового класса._createShape).Кастомные Item-классы могут содержать несколько графических
элементов. Для этого используется метод addChild:
var GroupItem = Item.extend({
initialize: function(position) {
Item.call(this);
this.position = position;
this.circle = new Path.Circle({
center: position,
radius: 20,
fillColor: 'red'
});
this.square = new Path.Rectangle({
point: [position.x - 15, position.y - 15],
size: [30, 30],
fillColor: 'green'
});
this.addChild(this.circle);
this.addChild(this.square);
},
setColors: function(circleColor, squareColor) {
this.circle.fillColor = circleColor;
this.square.fillColor = squareColor;
}
});
Особенности:
addChild добавляет дочерний элемент в иерархию
кастомного Item. Все трансформации (перемещение, масштабирование,
вращение) применяются к группе автоматически.Path, Raster,
Group и другие Item-объекты внутри одного кастомного
класса.Можно переопределять стандартные методы, такие как
onFrame, onMouseDown,
onMouseDrag, для создания интерактивных и анимационных
компонентов:
var DraggableItem = Item.extend({
initialize: function(position) {
Item.call(this);
this.circle = new Path.Circle({
center: position,
radius: 25,
fillColor: 'orange'
});
this.addChild(this.circle);
},
onMouseDrag: function(event) {
this.position += event.delta;
},
onFrame: function(event) {
this.rotate(1); // постоянное вращение
}
});
Важные моменты:
onMouseDown, onMouseUp,
onMouseDrag, onFrame вызываются автоматически
Paper.js при соответствующих событиях, если объект находится на
холсте.Кастомные Item-классы позволяют строить сложные композиции:
var Robot = Item.extend({
initialize: function(position) {
Item.call(this);
this.body = new Path.Rectangle({
point: [position.x - 20, position.y],
size: [40, 60],
fillColor: 'gray'
});
this.head = new Path.Circle({
center: [position.x, position.y - 35],
radius: 20,
fillColor: 'silver'
});
this.addChild(this.body);
this.addChild(this.head);
},
move: function(delta) {
this.position += delta;
},
setColors: function(bodyColor, headColor) {
this.body.fillColor = bodyColor;
this.head.fillColor = headColor;
}
});
Преимущества:
var robot1 = new Robot(new Point(100, 100));
var robot2 = new Robot(new Point(300, 150));
robot2.setColors('blue', 'yellow');
robot1.onMouseD rag = function(event) {
this.move(event.delta);
};
view.onFr ame = function(event) {
robot1.rotate(0.5);
};
Item.call(this) при наследовании.this._name) для
хранения внутренних элементов, чтобы не засорять публичный API.addChild для
упрощённого управления.initialize) —
инициализация позиции и создание графических элементов.onMouseDrag, onFrame и др.).addChild для
построения иерархий и группировки.Кастомные Item-классы превращают Paper.js в полноценный инструмент для создания интерактивной графики, игр и визуальных приложений, обеспечивая гибкость, модульность и контроль над элементами холста.