О чем этот пример
Линии — это фундаментальный графический примитив, который может быть не только статичным элементом оформления, но и динамичной частью игровой механики. В Phaser для работы с линиями существует простой и гибкий API, позволяющий создавать индикаторы здоровья, траектории выстрелов, векторные эффекты и даже простые геометрические анимации. В этой статье мы разберем, как создавать и управлять линиями, используя официальный пример из репозитория Phaser.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/skies/background1.png');
}
create ()
{
this.add.image(400, 300, 'bg');
const r1 = this.add.line(200, 200, 0, 0, 140, 0, 0x6666ff);
const r2 = this.add.line(400, 200, 0, 0, 140, 0, 0x9966ff);
// WebGL only
r2.setLineWidth(10, 40);
const r3 = this.add.line(600, 200, 0, 0, 140, 0, 0x1a65ac);
// WebGL only
r3.setLineWidth(1, 16);
const r4 = this.add.line(200, 400, 0, 0, 140, 0, 0xff6699);
const r5 = this.add.line(400, 400, 0, 0, 140, 0, 0xff33cc);
const r6 = this.add.line(600, 400, 0, 0, 140, 0, 0xff66ff);
this.tweens.add({
targets: r4,
scaleX: 0.25,
scaleY: 0.5,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
this.tweens.add({
targets: r5,
alpha: 0.2,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
this.tweens.add({
targets: r6,
angle: 90,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Создание базовой линии
Для добавления линии на сцену используется метод this.add.line(). Этот метод возвращает игровой объект типа Phaser.GameObjects.Line, который можно в дальнейшем анимировать или изменять.
Давайте посмотрим на его сигнатуру и создадим первую линию. Ключевой особенностью является задание координат начала и конца относительно локальных координат самого объекта (относительно его точки позиционирования).
const r1 = this.add.line(200, 200, 0, 0, 140, 0, 0x6666ff);
Первые два аргумента (200, 200) — это глобальные координаты (x, y) точки позиционирования (origin) линии на сцене. Следующие два аргумента (0, 0) задают координаты начала линии *относительно* этой точки позиционирования. Пятый и шестой аргументы (140, 0) задают координаты конца линии, также относительно точки позиционирования. Последний аргумент (0x6666ff) — это цвет линии в шестнадцатеричном формате. В данном примере создается горизонтальная линия длиной 140 пикселей, расположенная в точке (200, 200) на сцене.
Управление толщиной линии (только WebGL)
Phaser позволяет управлять толщиной линии, но важно помнить, что эта функция доступна только при использовании рендерера WebGL. Для Canvas-рендеринга толщина линии всегда равна 1 пикселю и не может быть изменена через API Phaser.
Для изменения толщины используется метод .setLineWidth(). Он принимает два параметра: толщину линии и, опционально, ширину концевых заглушек (line caps).
// WebGL only
r2.setLineWidth(10, 40);
r3.setLineWidth(1, 16);
В примере для объекта r2 задается толщина в 10 пикселей и ширина концевых заглушек в 40 пикселей, что создает эффект скругленных концов. Для объекта r3 толщина остается стандартной (1 пиксель), но устанавливаются более выраженные заглушки. Если вы разрабатываете кросс-платформенный проект, обязательно предусмотрите fallback-логику на случай использования Canvas.
Анимация линий с помощью Tween
Поскольку линии являются обычными игровыми объектами (Phaser.GameObjects), их свойства можно анимировать с помощью системы Tween. В примере показаны три типа анимации: масштабирование, изменение прозрачности и вращение.
Анимация создается через this.tweens.add(), где в качестве targets передается объект линии (или массив объектов).
this.tweens.add({
targets: r4,
scaleX: 0.25,
scaleY: 0.5,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
Эта анимация применяется к линии r4. Свойства scaleX и scaleY уменьшают линию по осям. Флаги yoyo: true и repeat: -1 заставляют анимацию играть вперед-назад бесконечно. ease: 'Sine.easeInOut' задает плавную, синусоидальную функцию easing.
this.tweens.add({
targets: r5,
alpha: 0.2,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
Здесь анимируется свойство alpha (прозрачность) линии r5, заставляя ее мигать.
this.tweens.add({
targets: r6,
angle: 90,
yoyo: true,
repeat: -1,
ease: 'Sine.easeInOut'
});
Эта твин-анимация вращает линию r6 на 90 градусов вокруг ее точки позиционирования, а затем обратно.
Практическое применение: от траекторий до UI
Линии в Phaser — это не просто рисунок. Их можно использовать для решения множества практических задач в игре.
* **Предсказание траектории:** Рассчитав путь снаряда или мяча, вы можете отрисовать его пунктирной линией (реализуется через настраиваемый шаблон штриховки, который, однако, требует дополнительной логики или шейдера). * **Интерфейсы:** Линии идеально подходят для рисования индикаторов здоровья, шкал загрузки, рамок и соединительных элементов в меню. * **Визуальные эффекты:** Множество анимированных линий могут создавать эффекты энергии, силовых полей или сканирования. * **Геометрические головоломки:** Линии могут быть элементами игры, которые нужно вращать или масштабировать для решения задачи.
Главное преимущество — их программная управляемость. Все параметры (начало, конец, цвет, толщина, видимость) можно менять динамически в ответ на действия игрока или логику игры.
Что попробовать дальше
Метод this.add.line() предоставляет быстрый и эффективный способ добавления векторных линий в вашу игру на Phaser. Несмотря на простоту, этот объект открывает широкие возможности для создания динамичного визуального контента и игровой логики, особенно в связке с системой твинов. Для экспериментов попробуйте: создать линию, которая следует за курсором мыши; сделать анимацию "прорисовки" линии от начала к концу, изменяя координату конечной точки; или скомбинировать несколько вращающихся линий разного цвета для создания гипнотического фонового эффекта.
