О чем этот пример
В игровой разработке геометрия — это не просто теория, а инструмент для создания динамического геймплея. Умение вычислять площади фигур помогает в коллизиях, генерации карт и балансировке механик. В этой статье мы разберем, как Phaser предоставляет простой API для работы с геометрией эллипса и как визуализировать его площадь в реальном времени, реагируя на действия игрока.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
const graphics = this.add.graphics({ lineStyle: { width: 2, color: 0x00aaaa }, fillStyle: { color: 0x0000aa } });
const ellipse = new Phaser.Geom.Ellipse(400, 300, 250, 150);
const text = this.add.text(400, 50, '');
this.input.on('pointermove', pointer =>
{
ellipse.setSize(pointer.x, pointer.y);
redraw();
});
redraw();
function redraw ()
{
graphics.clear();
const area = Phaser.Geom.Ellipse.Area(ellipse);
const squareSide = Math.sqrt(area);
graphics.fillRect(0, 0, squareSide, squareSide);
graphics.strokeEllipseShape(ellipse);
text.setText(`Ellipse Area: ${area}`);
}
}
}
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание сцены и графического объекта
В Phaser вся графика и логика происходят внутри сцен. В методе create мы инициализируем основные объекты.
Сначала создаем графический объект (graphics), который будет рисовать контуры и заливку. Мы задаем ему стиль линии и цвет заливки.
Затем создаем геометрический объект Phaser.Geom.Ellipse, определяющий эллипс по координатам центра и радиусам.
Также добавляем текстовый объект для отображения вычисленной площади.
const graphics = this.add.graphics({ lineStyle: { width: 2, color: 0x00aaaa }, fillStyle: { color: 0x0000aa } });
const ellipse = new Phaser.Geom.Ellipse(400, 300, 250, 150);
const text = this.add.text(400, 50, '');
Обработка ввода и динамическое изменение
Чтобы сделать пример интерактивным, мы подписываемся на событие перемещения указателя мыши (pointermove). При каждом движении мыши обновляем размеры эллипса, используя текущие координаты указателя в качестве новых радиусов.
Затем вызываем функцию redraw для перерисовки сцены.
this.input.on('pointermove', pointer => {
ellipse.setSize(pointer.x, pointer.y);
redraw();
});
Функция перерисовки и вычисление площади
Функция redraw отвечает за всю визуализацию. Сначала она очищает предыдущие рисунки с помощью graphics.clear().
Затем происходит ключевое вычисление: вызов статического метода Phaser.Geom.Ellipse.Area, который принимает объект эллипса и возвращает его площадь.
Чтобы визуализировать площадь, мы вычисляем сторону квадрата с такой же площадью (квадратный корень из площади) и рисуем этот квадрат в левом верхнем углу.
После этого отрисовываем контур самого эллипса и обновляем текстовую метку.
function redraw ()
{
graphics.clear();
const area = Phaser.Geom.Ellipse.Area(ellipse);
const squareSide = Math.sqrt(area);
graphics.fillRect(0, 0, squareSide, squareSide);
graphics.strokeEllipseShape(ellipse);
text.setText(`Ellipse Area: ${area}`);
}
Конфигурация и запуск игры
Каждый проект Phaser начинается с конфигурационного объекта, который передается в конструктор Phaser.Game. Здесь мы задаем базовые параметры: размеры холста, тип рендерера (WebGL или Canvas), родительский HTML-элемент и главную сцену.
const config = {
width: 800,
height: 600,
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Вы увидели, как Phaser объединяет геометрические вычисления, обработку ввода и графику в единый рабочий процесс. Метод Phaser.Geom.Ellipse.Area — это мощный, но простой инструмент для игровой логики. Для экспериментов попробуйте: использовать вычисленную площадь для изменения физических свойств объекта (например, массы), привязать размер эллипса не к курсору, а к игровому таймеру для создания пульсирующих эффектов или реализовать проверку коллизии на основе перекрытия площадей разных фигур.
