О чем этот пример
Обработка взаимодействия с игровыми объектами — основа интерактивности в браузерных играх. Phaser предоставляет простой и мощный API для работы с событиями мыши (или касания на мобильных устройствах). В этой статье мы разберем, как сделать спрайт кликабельным: изменить его цвет при нажатии и вернуть исходный вид при отпускании кнопки или уводе курсора. Этот базовый паттерн пригодится для создания кнопок, интерактивных персонажей и элементов интерфейса.
Версия 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('eye', 'assets/pics/lance-overdose-loader-eye.png');
}
create ()
{
const sprite = this.add.sprite(400, 300, 'eye').setInteractive();
sprite.on('pointerdown', function (pointer)
{
this.setTint(0xff0000);
});
sprite.on('pointerout', function (pointer)
{
this.clearTint();
});
sprite.on('pointerup', function (pointer)
{
this.clearTint();
});
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
В Phaser вся логика игры организована в сценах (Scene). Каждая сцена имеет жизненный цикл с методами, такими как preload и create. В методе preload мы загружаем необходимые ресурсы, например, изображения.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('eye', 'assets/pics/lance-overdose-loader-eye.png');
}
Здесь мы устанавливаем базовый URL для загрузки и загружаем изображение с ключом 'eye'. Это изображение будет использовано для создания спрайта.
Создание интерактивного спрайта
В методе create происходит инициализация игровых объектов. Чтобы спрайт мог реагировать на события мыши, его нужно сделать интерактивным с помощью метода .setInteractive().
create ()
{
const sprite = this.add.sprite(400, 300, 'eye').setInteractive();
}
Спрайт создается в координатах (400, 300) с текстурой 'eye'. Вызов setInteractive() без параметров делает всю площадь спрайта чувствительной к событиям указателя (мыши или касания).
Обработка событий указателя
После того как спрайт стал интерактивным, мы можем подписаться на его события. Основные события для обработки клика: pointerdown (кнопка нажата), pointerup (кнопка отпущена) и pointerout (курсор ушел с объекта).
sprite.on('pointerdown', function (pointer)
{
this.setTint(0xff0000);
});
Внутри функции-обработчика контекст this ссылается на сам спрайт (sprite). Метод setTint применяет цветовой оттенок (в данном случае красный 0xff0000) к спрайту.
sprite.on('pointerout', function (pointer)
{
this.clearTint();
});
sprite.on('pointerup', function (pointer)
{
this.clearTint();
});
События pointerout и pointerup очищают оттенок с помощью clearTint(), возвращая спрайту исходный вид. Это создает визуальную обратную связь для игрока.
Настройка и запуск игры
Конфигурация игры (config) определяет базовые параметры, такие как тип рендерера и корневая сцена. Объект game инстанцирует игру с этой конфигурацией.
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Поле type может быть Phaser.WEBGL или Phaser.CANVAS. parent — это ID HTML-элемента, в который будет встроен canvas игры. scene указывает на класс сцены, которая будет запущена первой.
Что попробовать дальше
Вы научились добавлять базовую интерактивность спрайтам в Phaser, используя события указателей. Это фундамент для создания любых кликабельных элементов. Для экспериментов попробуйте: изменить цвет оттенка на 0x00ff00; использовать событие pointerover для подсветки при наведении; вместо setTint изменить масштаб спрайта методом setScale; сделать интерактивной только часть спрайта, передав в setInteractive объект хитбокса.
