О чем этот пример

Работа с геометрией — фундамент для многих игровых механизмов: от определения столкновений до создания 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). Для экспериментов попробуйте: сделать все вершины треугольника динамическими; изменить цвет в зависимости от площади; использовать площадь для логики игры (например, если площадь меньше порога, считать объект "слишком маленьким"); или нарисовать несколько треугольников и вычислять их общую площадь.