В Paper.js каждый проект привязан к определённому
<canvas> элементу. Частая ошибка — попытка создавать
объекты до инициализации проекта.
Пример ошибки:
var circle = new Path.Circle({
center: [50, 50],
radius: 30,
fillColor: 'red'
});
paper.setup('myCanvas'); // проект инициализируется после создания объекта
Правильный подход:
var canvas = document.getElementById('myCanvas');
paper.setup(canvas);
var circle = new Path.Circle({
center: [50, 50],
radius: 30,
fillColor: 'red'
});
Ключевой момент: объект Paper.js должен создаваться
после вызова paper.setup().
Paper.js использует собственную систему координат, где
(0,0) находится в левом верхнем углу канваса. Ошибки
возникают при смешении с координатами DOM или CSS.
Пример ошибки:
var point = new Point(event.clientX, event.clientY);
var circle = new Path.Circle(point, 20);
Если канвас имеет отступы или изменён размер через CSS, координаты
clientX/clientY будут неправильными.
Решение:
var rect = canvas.getBoundingClientRect();
var point = new Point(event.clientX - rect.left, event.clientY - rect.top);
var circle = new Path.Circle(point, 20);
Вывод: всегда учитывается позиция канваса на странице и его масштаб.
Paper.js использует стек слоёв (Layer). Новые объекты
добавляются в активный слой, что может привести к неожиданным
результатам.
Симптом ошибки: объекты перекрывают друг друга
неправильно, или remove() не удаляет нужный элемент.
Пример решения:
var backgroundLayer = new Layer();
var foregroundLayer = new Layer();
backgroundLayer.activate();
var rect = new Path.Rectangle([0, 0], [100, 100]);
rect.fillColor = 'blue';
foregroundLayer.activate();
var circle = new Path.Circle([50, 50], 30);
circle.fillColor = 'red';
Ключевой момент: использовать
activate() для управления порядком рендеринга.
Часто создаются временные объекты, но ссылки на них не сохраняются. Это приводит к тому, что объекты невозможно модифицировать после создания.
Неправильно:
new Path.Circle([50, 50], 20).fillColor = 'green';
Правильно:
var circle = new Path.Circle([50, 50], 20);
circle.fillColor = 'green';
Совет: всегда сохранять объекты в переменные, если планируется их дальнейшее использование.
Paper.js рендерит объекты автоматически только после некоторых операций. Если объекты изменяются в цикле или асинхронно, визуальные изменения могут не отображаться.
Пример ошибки:
circle.position.x += 10; // изменения не видны без вызова view.update()
Решение:
circle.position.x += 10;
view.update(); // принудительное обновление канваса
Важно: при интенсивных анимациях правильнее
использовать view.onFrame вместо ручного вызова
view.update().
Paper.js предоставляет собственные обработчики событий
(onMouseDown, onMouseDrag,
onFrame). Ошибки возникают при попытке использовать
стандартные DOM-события на объектах Paper.js напрямую.
Неправильно:
circle.addEventListener('click', function() { ... });
Правильно:
circle.onMouseD own = function(event) {
this.fillColor = 'yellow';
};
Вывод: Paper.js имеет собственную систему событий, совместимую с её объектами.
Paper.js обновляется, и некоторые методы или свойства могут быть
устаревшими. Часто встречаются ошибки типа
undefined is not a function.
Пример:
circle.setRadius(50); // такого метода нет
Правильный способ:
circle.radius = 50;
Совет: регулярно сверять API на официальной документации и избегать устаревших методов.
Создание большого числа объектов без удаления приводит к замедлению и утечкам памяти.
Пример:
for (var i = 0; i < 1000; i++) {
new Path.Circle([i, i], 5);
}
Решение:
var circles = [];
for (var i = 0; i < 1000; i++) {
var c = new Path.Circle([i, i], 5);
circles.push(c);
}
// позднее удаление
circles.forEach(c => c.remove());
Вывод: для интенсивной графики необходимо контролировать удаление объектов.
Group позволяет объединять объекты, но изменения
применяются ко всем элементам сразу. Ошибки возникают при попытке
изменить отдельный объект через группу без ссылки на него.
Пример ошибки:
var group = new Group([circle1, circle2]);
group.fillColor = 'blue'; // меняет оба круга
Правильное решение:
circle1.fillColor = 'blue'; // отдельное изменение
Вывод: группы удобны для массовых трансформаций, но отдельные объекты лучше модифицировать напрямую.
Методы scale, rotate,
translate изменяют объекты относительно их центра или
родительского слоя. Ошибки возникают, если центр не установлен или
используется глобальная система координат.
Пример ошибки:
circle.rotate(45); // вращение вокруг центра объекта, а не сцены
Решение: использовать точку поворота явно:
circle.rotate(45, new Point(100, 100)); // вращение вокруг указанной точки
Вывод: трансформации требуют понимания координатной системы Paper.js.
Эти ошибки являются наиболее частыми при работе с Paper.js и их систематическое понимание позволяет писать более стабильный и предсказуемый код.