В Phaser координаты объектов могут быть представлены в разных системах: координаты сцены (world coordinates) и координаты экрана (screen coordinates). Понимание различий и способов их преобразования критично для реализации точного позиционирования, взаимодействия с пользователем и визуальных эффектов.
Координаты сцены описывают положение объектов относительно глобальной системы сцены. Эта система фиксирована и не зависит от камеры, масштаба или сдвигов.
x и y объектов сцены отражают их положение
в пределах сцены.Пример:
let sprite = this.add.sprite(100, 200, 'player');
console.log(sprite.x, sprite.y); // 100, 200
Даже если камера сдвигается, sprite.x и
sprite.y остаются прежними.
Координаты экрана описывают положение объектов относительно видимой области на экране. Они зависят от камеры, масштабирования и сдвига сцены.
Пример получения экранных координат объекта:
let camera = this.cameras.main;
let screenX = camera.worldView.x + sprite.x;
let screenY = camera.worldView.y + sprite.y;
Однако в Phaser есть более удобные методы.
Phaser предоставляет встроенные функции для работы с преобразованием координат:
camera.worldView
и camera.worldViewToCameracamera.worldView — прямоугольник
(Phaser.Geom.Rectangle), который описывает видимую область
сцены.camera.worldView.x и camera.worldView.y
позволяют вычислять смещение для перевода координат сцены в экранные
координаты.Camera.worldToScreenPhaser 3 не содержит прямого метода worldToScreen в API,
но можно использовать Camera.getWorldPoint(x, y) и
Camera.getWorldPoint(pointer.x, pointer.y) для обратного
преобразования:
camera.getWorldPoint(screenX, screenY) — конвертирует
координаты экрана в координаты сцены.Пример:
this.input.on('pointerdown', function (pointer) {
let worldPoint = this.cameras.main.getWorldPoint(pointer.x, pointer.y);
console.log(worldPoint.x, worldPoint.y);
}, this);
Таким образом, координаты нажатия переводятся в глобальную систему сцены.
Камера Phaser поддерживает zoom, что также влияет на преобразование координат.
camera.zoom.Пример преобразования с учетом zoom:
let camera = this.cameras.main;
let screenX = (sprite.x - camera.scrollX) * camera.zoom;
let screenY = (sprite.y - camera.scrollY) * camera.zoom;
camera.scrollX и camera.scrollY —
положение верхнего левого угла камеры в координатах сцены.camera.zoom — коэффициент масштабирования.Для сложных случаев, например, при вращении камеры, можно
использовать матрицы преобразования
(Matrix4 или TransformMatrix в Phaser).
camera.getWorldTransformMatrix() возвращает матрицу,
которая может быть применена к любой точке.Пример:
let matrix = camera.getWorldTransformMatrix();
let point = new Phaser.Math.Vector2(sprite.x, sprite.y);
matrix.transformPoint(point.x, point.y, point);
console.log(point.x, point.y); // экранные координаты
Обработка ввода мыши и касаний: Преобразование экранных координат указателя в координаты сцены позволяет точно определить объект под курсором.
Слежение за объектами: Для UI-элементов, которые должны следовать за объектами сцены, требуется конвертация координат сцены в экранные.
Эффекты камеры и параллакс: Элементы, не относящиеся к сцене (HUD, меню), остаются в экранной системе координат, тогда как спрайты сцены смещаются камерой.
camera.getWorldPoint(x, y) — экран → сцена.(sprite.x - camera.scrollX) * camera.zoom — сцена →
экран.camera.getWorldTransformMatrix().Эффективное управление координатами между сценой и экраном обеспечивает точное взаимодействие объектов, стабильное позиционирование элементов интерфейса и правильное отображение визуальных эффектов.