В основе позиционирования спрайтов в PixiJS лежит понимание того,
от какой точки объекта рассчитываются координаты. По
умолчанию координаты x и y указывают на левый
верхний угол текстуры. Такое поведение не всегда удобно: вращение,
масштабирование и выравнивание относительно центра требуют иной системы
отсчёта. Для этого используется свойство anchor.
anchoranchor — это точка привязки спрайта, определяющая,
какая часть текстуры считается его координатной
точкой.
Свойство доступно у PIXI.Sprite и представляет собой
объект ObservablePoint с двумя значениями:
sprite.anchor.x
sprite.anchor.y
или кратко:
sprite.anchor.set(x, y);
Значения anchor находятся в диапазоне от 0
до 1:
| Значение | Значение по оси | Описание |
|---|---|---|
0 |
начало | левый или верхний край |
0.5 |
центр | центр текстуры |
1 |
конец | правый или нижний край |
По умолчанию:
sprite.anchor.set(0, 0);
Это означает:
sprite.x и sprite.y
соответствуют левому верхнему углуТакое поведение удобно при верстке интерфейсов, но неудобно при работе с игровыми объектами.
Наиболее распространённое использование:
sprite.anchor.set(0.5);
Теперь:
Это особенно важно для:
anchor на позиционированиеПусть текстура имеет размер 100×100 пикселей.
(x, y)
┌───────────────
│
│
│
Точка (x, y) находится в левом верхнем углу.
(x, y)
●
┌───────────────
│
│
Точка (x, y) находится в центре.
rotation)Вращение всегда происходит вокруг точки anchor.
sprite.rotation = Math.PI / 4;
Если anchor = (0, 0), объект будет вращаться вокруг
верхнего левого угла, описывая круг.
Если anchor = (0.5, 0.5), вращение будет естественным —
вокруг центра.
Для анимаций вращения центрирование практически обязательно.
scale)Масштабирование также зависит от точки привязки:
sprite.scale.set(2);
anchor = (0, 0) объект “растёт” вправо и вниз.anchor = (0.5, 0.5) объект увеличивается
симметрично.Это критично при создании эффектов:
Часто требуется центрировать объект на сцене:
sprite.anchor.set(0.5);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
Если не установить anchor = 0.5, спрайт окажется
смещён.
sprite.anchor.set(1, 1);
sprite.x = app.screen.width;
sprite.y = app.screen.height;
Теперь объект будет “прижат” к правому нижнему углу.
sprite.anchor.set(0.5, 0);
sprite.x = app.screen.width / 2;
sprite.y = 0;
Значения anchor не обязаны быть только 0, 0.5 или 1.
Пример:
sprite.anchor.set(0.3, 0.8);
Это используется для:
anchor от
pivotВ библиотеке PixiJS существуют два похожих свойства:
| Свойство | Работает в | Измеряется в | Назначение |
|---|---|---|---|
anchor |
Sprite |
долях (0–1) | точка привязки текстуры |
pivot |
DisplayObject |
пикселях | смещение системы координат |
anchor работает относительно размеров
текстурыpivot задаётся в пикселяхПример pivot:
sprite.pivot.set(50, 50);
Если текстура 100×100, это аналогично
anchor.set(0.5).
Однако pivot применяется ко всем объектам, включая
контейнеры (Container), а anchor — только к
спрайтам.
anchor влияет только на конкретный спрайт и не изменяет
координатную систему родительского контейнера.
container.addChild(sprite);
Изменение sprite.anchor:
containersprite.x = 400;
sprite.y = 300;
sprite.anchor.set(0.5);
После изменения anchor визуальное положение изменится,
потому что точка отсчёта сместилась.
Правильный порядок:
sprite.anchor.set(0.5);
sprite.x = 400;
sprite.y = 300;
anchor не существует у Container.
Попытка:
container.anchor.set(0.5);
вызовет ошибку.
Без учёта anchor элементы интерфейса часто оказываются
смещёнными на половину своей ширины или высоты.
Точка anchor влияет и на интерактивную область:
sprite.eventMode = 'static';
sprite.on('pointerdown', handler);
Область клика будет рассчитываться с учётом точки привязки. При
центрированном anchor область также центрируется.
У PIXI.Text нет свойства anchor, но есть
pivot.
Чтобы центрировать текст:
text.pivot.set(text.width / 2, text.height / 2);
text.x = 400;
text.y = 300;
Начиная с более поздних версий библиотеки текст может поддерживать
anchor, если используется как спрайт через
Text-наследование.
anchor можно менять во время работы приложения:
app.ticker.add(() => {
sprite.anchor.x = Math.abs(Math.sin(Date.now() * 0.001));
});
Это создаёт нестандартные визуальные эффекты, так как точка вращения постоянно изменяется.
player.anchor.set(0.5, 1);
Нижняя центральная точка — логичная опора для персонажа, стоящего на земле.
healthBar.anchor.set(0.5, 1);
healthBar.y = -20;
crosshair.anchor.set(0.5);
crosshair.position.copyFrom(app.renderer.plugins.interaction.mouse.global);
Внутренне anchor влияет на вычисление локальной матрицы
преобразования. Смещение точки привязки добавляется к трансформации
перед применением:
Таким образом, anchor — это часть геометрической модели
объекта, а не просто визуальный сдвиг.
anchor.set(0.5)(0.5, 1)anchor до позиционированияanchor и
pivotГрамотное использование точки привязки обеспечивает предсказуемое поведение вращения, масштабирования и выравнивания объектов в сцене.