О чем этот пример
Создание динамичного фона — частая задача в разработке игр. Использование плиточных спрайтов (TileSprite) позволяет бесшовно заполнять большие области текстурой, экономя ресурсы и добавляя движению плавности. В этой статье мы разберем пример, который демонстрирует, как загрузить атлас текстур и анимировать несколько плиточных спрайтов, создавая простой, но живой фон для вашей игры.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
iter = 0;
images = [];
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.images[i] = this.add.tileSprite(i * 160, 0, 160, 600, 'atlas', frames[i]);
this.images[i].originX = 0;
this.images[i].originY = 0;
}
}
update ()
{
let x = 1;
for (let i = 0; i < this.images.length; ++i)
{
this.images[i].tilePositionX += x;
x *= -1;
}
this.iter += 0.01;
}
}
const config = {
type: Phaser.CANVAS,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов: подготовка атласа
Перед созданием спрайтов необходимо загрузить текстуры. В Phaser для этого используется метод 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');
}
Метод setBaseURL устанавливает базовый URL для всех последующих загрузок, что удобно, если ресурсы хранятся в одной директории. Метод load.atlas загружает сам атлас, принимая ключ 'atlas' (по нему мы будем обращаться к ресурсу), путь к изображению и путь к JSON-файлу с разметкой.
Создание плиточных спрайтов
В методе create происходит инициализация игровых объектов. Мы создаем массив из пяти плиточных спрайтов (TileSprite), используя разные фреймы из загруженного атласа.
create ()
{
const frames = [ 'atari400', 'bunny', 'cokecan', 'copy-that-floppy', 'hotdog' ];
for (let i = 0; i < frames.length; ++i)
{
this.images[i] = this.add.tileSprite(i * 160, 0, 160, 600, 'atlas', frames[i]);
this.images[i].originX = 0;
this.images[i].originY = 0;
}
}
Каждый TileSprite создается с помощью this.add.tileSprite. Параметры: координаты X и Y, ширина, высота, ключ атласа и имя конкретного фрейма. Спрайты размещаются горизонтально с шагом в 160 пикселей. Установка originX и originY в 0 меняет точку привязки (origin) спрайта на его левый верхний угол, что упрощает выравнивание.
Анимация через смещение текстуры
Основная "магия" анимации происходит в методе update, который вызывается каждый кадр. Вместо перемещения самих спрайтов мы сдвигаем их текстуру, создавая эффект бесконечного прокручивания.
update ()
{
let x = 1;
for (let i = 0; i < this.images.length; ++i)
{
this.images[i].tilePositionX += x;
x *= -1;
}
this.iter += 0.01;
}
Свойство tilePositionX объекта TileSprite определяет смещение текстуры по горизонтали. В цикле мы поочередно добавляем к нему +1 или -1 для каждого спрайта (переменная `x` меняет знак на каждой итерации). Это создает эффект движения текстур в разных направлениях, что визуально интереснее, чем однонаправленная прокрутка.
Конфигурация игры и запуск
Весь пример завершается созданием экземпляра игры Phaser.Game с конфигурационным объектом. В нем задаются основные параметры, такие как тип рендерера, размеры холста и стартовая сцена.
const config = {
type: Phaser.CANVAS,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Ключевые параметры: type определяет рендерер (Canvas или WebGL), width и height — размеры игрового поля, backgroundColor — цвет фона, parent — ID HTML-элемента для встраивания игры, scene — класс стартовой сцены.
Что попробовать дальше
Плиточные спрайты — мощный инструмент для создания оптимизированных и анимированных фонов. Вы можете экспериментировать: изменять скорость анимации через tilePositionX/Y, использовать одну текстуру для создания бесшовного паттерна или комбинировать несколько TileSprite для сложных многослойных фонов с параллакс-эффектом.
