О чем этот пример
Работа с геометрией — фундамент для многих игровых механизмов: от определения столкновений до создания procedural контента. Этот пример демонстрирует, как использовать объект `Phaser.Geom.Triangle` и его метод `Area()` для мгновенного вычисления площади фигуры, реагирующей на движение курсора. Это полезно для понимания, как Phaser работает с внутренними геометрическими структурами и как легко можно визуализировать их, связывая математику с графикой.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
const graphics = this.add.graphics({ fillStyle: { color: 0xaaaa00 } });
const triangle = new Phaser.Geom.Triangle(0, 0, 0, 600, 400, 300);
const text = this.add.text(400, 50, '');
this.input.on('pointermove', pointer =>
{
triangle.x3 = pointer.x;
triangle.y3 = pointer.y;
redraw();
});
redraw();
function redraw ()
{
graphics.clear();
graphics.fillTriangleShape(triangle);
const area = Phaser.Geom.Triangle.Area(triangle);
text.setText(`Triangle Area: ${area}`);
}
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание геометрического объекта и его визуализации
В начале метода create() создаются два ключевых объекта: Graphics для рисования и Triangle как геометрическое представление.
const graphics = this.add.graphics({ fillStyle: { color: 0xaaaa00 } });
const triangle = new Phaser.Geom.Triangle(0, 0, 0, 600, 400, 300);
Объект graphics настроен на заполнение цветом 0xaaaa00. Треугольник создаётся с начальными координатами трёх точек: (x1, y1), (x2, y2), (x3, y3). Эти точки задают его первоначальную форму. Объект Triangle здесь служит только контейнером для данных о вершинах, сам он ничего не рисует.
Обработка ввода и динамическое изменение формы
Чтобы фигура реагировала на движение мыши, используется событие pointermove. При каждом движении курсора координаты третьей вершины треугольника обновляются.
this.input.on('pointermove', pointer => {
triangle.x3 = pointer.x;
triangle.y3 = pointer.y;
redraw();
});
Таким образом, треугольник становится динамическим: две вершины фиксированы, а третья "привязывается" к положению указателя. После каждого изменения вызывается функция redraw() для обновления изображения и вычислений.
Функция перерисовки: визуализация и вычисление площади
Функция redraw() выполняет три действия: очищает предыдущее рисование, заполняет новый треугольник и вычисляет его площадь.
function redraw () {
graphics.clear();
graphics.fillTriangleShape(triangle);
const area = Phaser.Geom.Triangle.Area(triangle);
text.setText(`Triangle Area: ${area}`);
}
Метод clear() удаляет всё, нарисованное ранее этим объектом graphics. fillTriangleShape() принимает геометрический объект triangle и заполняет его заданным стилем. Статический метод Phaser.Geom.Triangle.Area() принимает объект треугольника как аргумент и возвращает его площадь (положительное число). Результат выводится в текстовый объект text.
Конфигурация игры и запуск
Пример завершается стандартной конфигурацией Phaser игры и её созданием.
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Конфигурация задаёт размеры области отображения (800x600), автоматический выбор типа рендера (AUTO), идентификатор родительского элемента и главную сцену Example. Инстанс игры запускает всю логику.
Что попробовать дальше
Этот пример показывает чистую связь между геометрической моделью (Phaser.Geom.Triangle), её визуализацией (Graphics) и полезным вычислением (Area). Для экспериментов попробуйте: сделать все вершины треугольника динамическими; изменить цвет в зависимости от площади; использовать площадь для логики игры (например, если площадь меньше порога, считать объект "слишком маленьким"); или нарисовать несколько треугольников и вычислять их общую площадь.
