О чем этот пример
Визуальные эффекты часто требуют динамического изменения цвета и текстуры объектов. В Phaser 3 для этого существуют мощные инструменты, такие как TileSprite и работа с оттенками (tint). Эта статья разберет практический пример, где мы применяем разные оттенки к нескольким TileSprite и анимируем их текстуры, создавая комплексный панорамный эффект. Вы научитесь эффективно использовать `setTint` для контроля цвета и управлять движением текстур через `tilePosition`, что полезно для создания фонов, анимированных элементов интерфейса или стилизованных игровых объектов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
constructor ()
{
super();
this.tilesprites = [];
}
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.atlas('atlas', 'assets/atlas/megaset-2.png', 'assets/atlas/megaset-2.json');
}
create ()
{
const frames = ['atari400', 'bunny', 'cokecan', 'copy-that-floppy', 'hotdog'];
for (let i = 0; i < frames.length; ++i)
{
this.tilesprites[i] = this.add.tileSprite(i * 160, 0, 160, 600, 'atlas', frames[i]);
this.tilesprites[i].setOrigin(0)
this.tilesprites[i].setTint(0xff00ff, 0xffff00, 0x0000ff, 0xff0000);
}
}
update ()
{
let x = 1;
for (var i = 0; i < this.tilesprites.length; ++i)
{
this.tilesprites[i].tilePositionX += x;
this.tilesprites[i].tilePositionY += x;
x *= -1;
}
}
}
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
Класс Example расширяет Phaser.Scene и содержит массив tilesprites для хранения объектов. В методе preload мы загружаем атлас текстур — единое изображение с набором спрайтов и JSON-файл, описывающий их границы. Это оптимизирует загрузку и управление ресурсами.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.atlas('atlas', 'assets/atlas/megaset-2.png', 'assets/atlas/megaset-2.json');
}
Создание TileSprite с применением оттенков
В методе create мы создаем массив кадров (frames) из атласа. Для каждого кадра создается объект TileSprite с помощью this.add.tileSprite. Параметры задают позицию (x, y), размер (ширина, высота), ключ атласа и имя кадра. setOrigin(0) устанавливает точку отсчета в левый верхний угол для удобства позиционирования.
Ключевой момент — применение setTint с четырьмя шестнадцатеричными значениями цвета. Эти цвета применяются к четырем углам TileSprite, создавая градиентный эффект. Например, первый спрайт получит оттенки от пурпурного (0xff00ff) до желтого (0xffff00), синего (0x0000ff) и красного (0xff0000).
create ()
{
const frames = ['atari400', 'bunny', 'cokecan', 'copy-that-floppy', 'hotdog'];
for (let i = 0; i < frames.length; ++i)
{
this.tilesprites[i] = this.add.tileSprite(i * 160, 0, 160, 600, 'atlas', frames[i]);
this.tilesprites[i].setOrigin(0)
this.tilesprites[i].setTint(0xff00ff, 0xffff00, 0x0000ff, 0xff0000);
}
}
Анимация движения текстуры
Метод update вызывается каждый кадр и отвечает за анимацию. Мы используем переменную `x` со значением 1 и инвертируем ее после каждого спрайта, умножая на -1. Это создает эффект "волны": текстуры двигаются в противоположных направлениях.
Свойства tilePositionX и tilePositionY управляют смещением текстуры внутри TileSprite. Их увеличение на `x` приводит к плавному движению, имитирующему прокрутку или поток. Это особенно полезно для создания бесконечных фонов или динамических узоров.
update ()
{
let x = 1;
for (var i = 0; i < this.tilesprites.length; ++i)
{
this.tilesprites[i].tilePositionX += x;
this.tilesprites[i].tilePositionY += x;
x *= -1;
}
}
Конфигурация игры
Объект config определяет основные настройки игры. Мы используем Phaser.WEBGL для рендеринга, что обеспечивает лучшую производительность для графических эффектов. Размеры холста — 800x600 пикселей, цвет фона — темно-серый (#2d2d2d). Параметр parent указывает ID HTML-элемента для встраивания игры. Сцена Example передается как класс для инициализации.
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
Затем создается экземпляр игры new Phaser.Game(config), который запускает весь процесс.
Что попробовать дальше
Использование TileSprite с оттенками и анимацией текстуры открывает широкие возможности для визуального дизайна в Phaser 3. Вы можете экспериментировать: измените цвета в setTint для создания разных градиентов, используйте другие кадры из атласа, варьируйте скорость движения через множитель для `x, или добавьте взаимодействие с пользователем, например, изменяяtilePosition` по клику. Также попробуйте комбинировать несколько TileSprite для сложных фоновых композиций.
