Phaser — это мощная библиотека для разработки 2D-игр на JavaScript, которая оперирует системой координат, включающей локальные (local) и мировые (world) позиции объектов. Понимание разницы между этими системами критически важно для управления объектами, взаимодействия с пользователем и реализации сложных игровых механик.
Каждый объект в Phaser, будь то спрайт, контейнер или текст, имеет координаты x и y, определяющие его позицию. Существует два уровня координат:
Формула преобразования выглядит так:
[ = + ] [ = + ]
Основные свойства, связанные с позициями:
x и y — локальные координаты объекта.parentContainer — ссылка на родительский контейнер
(если есть).getWorldTransformMatrix() — возвращает матрицу
трансформации, которая позволяет вычислять мировые координаты, включая
масштаб и вращение.getBounds() — возвращает мировой
прямоугольник объекта с учетом всех трансформаций.Пример использования мировых координат:
const worldPoint = sprite.getWorldTransformMatrix().transformPoint(0, 0);
console.log(worldPoint.x, worldPoint.y);
Этот метод позволяет узнать, где конкретная точка спрайта находится в сцене.
Контейнеры
(Phaser.GameObjects.Container) позволяют объединять
несколько объектов в одну группу. Координаты объектов внутри контейнера
локальные относительно контейнера. Это упрощает
перемещение группы объектов и их трансформации.
Пример:
const container = this.add.container(100, 50);
const sprite = this.add.sprite(10, 20, 'hero');
container.add(sprite);
console.log(sprite.x); // 10 — локальная позиция внутри контейнера
console.log(sprite.getWorldTransformMatrix().tx); // 110 — мировая позиция
Здесь спрайт имеет локальные координаты (10, 20), но его
мировая позиция учитывает смещение контейнера
(100, 50).
Phaser предоставляет методы для преобразования координат между локальной и мировой системами:
container.worldToLocal(x, y) — преобразует мировые
координаты в локальные относительно контейнера.container.localToWorld(x, y) — преобразует локальные
координаты в мировые.Пример:
const localPoint = container.worldToLocal(150, 80);
console.log(localPoint.x, localPoint.y); // координаты внутри контейнера
Это полезно при обработке кликов мышью, когда требуется определить, где пользователь нажал относительно объекта в контейнере.
Трансформации, такие как масштабирование, вращение и сдвиг, изменяют мировые координаты объектов, но локальные координаты остаются прежними.
Пример с вращением:
sprite.angle = 45; // вращение в градусах
const worldPoint = sprite.getWorldTransformMatrix().transformPoint(0, 0);
console.log(worldPoint); // мировая позиция с учётом вращения
Мировые координаты учитывают все преобразования: позицию родителя, масштаб, угол поворота. Это позволяет точно позиционировать объекты и отслеживать столкновения в игровой сцене.
getWorldTransformMatrix().Локальные и мировые координаты в Phaser создают мощный инструмент для управления объектами в сцене. Глубокое понимание их взаимодействия и методов преобразования позволяет строить сложные сцены, реализовывать динамическое позиционирование и создавать плавные, масштабируемые игровые механики.