О чем этот пример

Tilesprite, или тайл-спрайт, — это мощный объект Phaser, который позволяет заполнить область повторяющимся изображением. В отличие от обычного спрайта, он может быть динамически масштабирован, повернут и «замощен» без потери производительности. Эта техника идеально подходит для создания бесконечных фонов, параллакс-эффектов и анимированных текстур в пиксель-арт играх. В статье мы разберем практический пример управления тайл-спрайтом в реальном времени.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    iter = 0;
    tilesprite;

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('mushroom', 'assets/sprites/mushroom16x16.png');
    }

    create ()
    {
        this.tilesprite = this.add.tileSprite(400, 300, 800, 600, 'mushroom');
    }

    update ()
    {
        this.tilesprite.rotation -= 0.01;

        this.tilesprite.tileScaleX = Math.sin(this.iter) * 10;
        this.tilesprite.tileScaleY = Math.sin(this.iter) * 10;

        this.iter += 0.01;
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    pixelArt: true,
    backgroundColor: '#2d2d2d',
    scene: Example
};

const game = new Phaser.Game(config);

Что такое TileSprite и зачем он нужен

TileSprite — это игровой объект, который повторяет (заполняет) заданную текстуру по всей своей площади. Это похоже на CSS-свойство background-repeat: repeat. Ключевое преимущество — вы можете управлять масштабом и позицией текстуры внутри области независимо от самого объекта.

В играх это часто используется для: * Фонов, которые нужно плавно сдвигать (например, бегущая дорога). * Динамических текстур (воды, огня), где текстура масштабируется или смещается. * Оптимизации: один небольшой файл изображения может заполнить огромную область экрана.

В нашем примере в качестве текстуры используется маленькое изображение гриба размером 16x16 пикселей.

Настройка сцены и создание TileSprite

В методе preload загружается ресурс. Обратите внимание на pixelArt: true в конфиге — это важная настройка для сохранения четкости пиксельной графики при масштабировании.

В create создается сам тайл-спрайт. Конструктор this.add.tileSprite принимает ключевые параметры: координаты центра (x, y), ширину и высоту самой области (в пикселях) и ключ текстуры.

this.tilesprite = this.add.tileSprite(400, 300, 800, 600, 'mushroom');

Здесь создается объект размером 800x600 пикселей, центрированный на экране, который будет заполнен повторяющимися грибами.

Динамическое управление в методе Update

Вся магия происходит в методе update, который выполняется каждый кадр. Здесь мы анимируем три свойства тайл-спрайта.

1. **Вращение:** Мы плавно вращаем весь объект вокруг его центра.

this.tilesprite.rotation -= 0.01;

2. **Масштаб текстуры:** Свойства tileScaleX и tileScaleY управляют масштабом *самой текстуры* внутри области, а не размерами области. Значение 1 — оригинальный размер. Используя синус от нарастающего значения iter, мы получаем плавное пульсирующее изменение масштаба от -10 до 10.

this.tilesprite.tileScaleX = Math.sin(this.iter) * 10;
    this.tilesprite.tileScaleY = Math.sin(this.iter) * 10;

Отрицательные значения масштаба зеркально отражают текстуру, что добавляет визуально интересный эффект.

3. **Счетчик итераций:** Переменная iter увеличивается каждый кадр, обеспечивая непрерывное изменение аргумента для Math.sin().

this.iter += 0.01;

Ключевые свойства TileSprite для анимации

Для создания сложных эффектов запомните эти свойства:

* tilePositionX / tilePositionY: Смещение начала текстуры. Изменяя их, можно создать эффект прокрутки фона. * tileScaleX / tileScaleY: Масштаб текстуры, как в нашем примере. * rotation и scale: Стандартные свойства любого игрового объекта, влияющие на всю область тайл-спрайта.

Например, для бесконечной горизонтальной прокрутки фона в методе update нужно добавить:

this.tilesprite.tilePositionX += 2;

Что попробовать дальше

TileSprite — это не просто статичный фон, а полноценный анимируемый объект. Он открывает большие возможности для оптимизации (используя маленькие текстуры) и создания динамических визуальных эффектов прямо во время выполнения игры. Поэкспериментируйте: попробуйте анимировать tilePosition для имитации движения воды или параллакса, примените разные текстуры для слоев неба и земли или комбинируйте масштаб и позицию для эффекта «дыхания» фонового узора.