О чем этот пример
Работа с координатами — основа любой игровой механики. Понимание, как управлять положением объектов относительно центра или других точек, открывает путь к созданию симметричных уровней, отражений и сложных траекторий. В этом примере мы рассмотрим метод `invert()` класса `Phaser.Math.Vector2`, который позволяет мгновенно получить координаты, противоположные исходным относительно начала системы координат (точки 0,0). Это простой, но мощный инструмент для геометрических преобразований.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
const graphics = this.add.graphics({ fillStyle: { color: 0x2266aa } });
const point = new Phaser.Math.Vector2(400, 100);
this.input.on('pointermove', pointer =>
{
point.copy(pointer);
redraw();
});
redraw();
function redraw ()
{
graphics.clear();
graphics.fillPointShape(point, 15);
point.invert();
graphics.fillStyle(0x00aa00);
graphics.fillPointShape(point, 15);
}
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что делает метод `invert()`?
Метод invert() объекта Phaser.Math.Vector2 выполняет операцию инвертирования вектора. Проще говоря, он умножает каждую из его координат (x и y) на -1. В результате точка с координатами (x, y) мгновенно превращается в точку (-x, -y).
Геометрически это означает отражение точки относительно начала координат (точки 0,0 на экране). Если представить себе систему координат, то инвертированная точка будет находиться в противоположном квадранте на том же расстоянии от центра.
Разбор примера: интерактивное зеркало
В предложенном примере создается интерактивная визуализация. Пользователь перемещает курсор мыши, а на экране отображаются две точки: исходная (синяя) и её инвертированная версия (зеленая).
Сначала создается вектор point, который будет отслеживать положение курсора. Слушатель события pointermove обновляет координаты этого вектора при каждом движении мыши и вызывает функцию перерисовки redraw().
const point = new Phaser.Math.Vector2(400, 100);
this.input.on('pointermove', pointer =>
{
point.copy(pointer);
redraw();
});
Визуализация в функции `redraw()`
Функция redraw() отвечает за отрисовку. Она очищает холст и рисует две точки. Ключевой момент: метод invert() вызывается непосредственно на объекте point, изменяя его координаты на месте. После этого для рисования инвертированной точки используется тот же вектор, но уже с новыми значениями.
Важно понимать, что invert() модифицирует исходный объект. Если вам нужно сохранить первоначальные координаты, следует создать копию вектора перед инвертированием.
function redraw ()
{
graphics.clear();
// Рисуем исходную точку (синюю)
graphics.fillPointShape(point, 15);
// Инвертируем координаты точки
point.invert();
// Меняем цвет и рисуем инвертированную точку (зеленую)
graphics.fillStyle(0x00aa00);
graphics.fillPointShape(point, 15);
}
Обратите внимание, что после первой отрисовки точка point уже инвертирована. Однако при следующем движении мыши слушатель события pointermove снова копирует в неё новые координаты курсора (point.copy(pointer)), перезаписывая инвертированные значения. Таким образом, цикл начинается заново.
Практическое применение в играх
Инвертирование вектора — это не просто абстрактная математика. Вот несколько практических сценариев:
* **Создание симметричных противников или уровней:** Расположив объект в точке (100, 200), его "зеркальную" копию можно мгновенно получить в точке (-100, -200) относительно центра сцены. * **Расчет отскока от центра:** При столкновении с условным "ядром" мира можно использовать инвертирование вектора скорости для простой симуляции отталкивания. * **Траектории и паттерны атак:** Генерация атак, симметричных относительно босса в центре экрана.
Для работы относительно произвольной точки (не начала координат) используется не invert(), а комбинация других методов, например, сначала вычесть координаты центра из координат точки, затем инвертировать результат и снова прибавить координаты центра.
Что попробовать дальше
Метод invert() — это быстрый и эффективный способ получить координаты, противоположные исходным. Он работает напрямую с объектом, изменяя его данные. Поэкспериментируйте: попробуйте инвертировать не вектор позиции, а вектор скорости объекта для создания эффекта "отталкивания" от центра. Или сохраните исходную точку в отдельной переменной, чтобы рисовать линию, соединяющую объект с его зеркальным отражением, создавая интересные визуальные паттерны.
