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

Работая с 2D-графикой в играх, часто возникает задача заполнить большую область фона или объекта одной повторяющейся текстурой. Обычный спрайт (`Sprite`) для этого не подходит — он лишь отобразит одну копию изображения. Решение — объект `TileSprite` (плиточный спрайт). Он позволяет создать прямоугольную область, которая автоматически заполняется выбранной текстурой, подобно плитке, и которую можно вращать и масштабировать как единое целое. Эта статья разбирает простой пример создания `TileSprite`, объясняет его ключевые свойства и показывает, как легко управлять им для создания бесшовных фонов или крупных составных объектов.

Версия 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('mushroom', 'assets/sprites/mushroom-32x32.png');
    }

    create ()
    {
        const test = this.add.tileSprite(400, 300, 32 * 14, 32 * 8, 'mushroom');

        test.setAngle(20).setScale(0.5);

        console.log(test);
    }
}

const config = {
    type: Phaser.CANVAS,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: Example
};

const game = new Phaser.Game(config);

Что такое TileSprite?

TileSprite — это игровой объект Phaser, представляющий собой прямоугольную область, заполненную текстурой. Текстура повторяется (тайлится) по горизонтали и вертикали, чтобы покрыть всю заданную область. В отличие от простого растягивания, тайлинг сохраняет детализацию исходного изображения.

Главное преимущество — вы работаете с одной текстурой в памяти, но визуально получаете большую поверхность. Это эффективно для создания фонов, платформ, стен или водных поверхностей.

В примере используется текстура гриба размером 32x32 пикселя, которая будет многократно повторена внутри спрайта.

Создание и конфигурация TileSprite

Объект создается с помощью метода this.add.tileSprite(x, y, width, height, textureKey). Давайте разберем параметры на примере из кода:

const test = this.add.tileSprite(400, 300, 32 * 14, 32 * 8, 'mushroom');

* 400, 300: Координаты центра спрайта на игровом холсте. * 32 * 14, 32 * 8: Ширина и высота области, которую нужно заполнить. В данном случае это 448x256 пикселей (14 и 8 тайлов по 32 пикселя каждый). Phaser автоматически рассчитает, сколько копий текстуры нужно для заполнения. * 'mushroom': Ключ текстуры, загруженной в preload.

Сразу после создания с объектом можно работать. В примере он поворачивается и масштабируется цепочкой вызовов:

test.setAngle(20).setScale(0.5);

* setAngle(20): Поворачивает весь TileSprite на 20 градусов. * setScale(0.5): Уменьшает весь спрайт (включая его область тайлинга) в два раза. Обратите внимание, что при масштабировании меняется видимая область, но логический размер (заданный при создании) остается прежним.

Практический вывод и отладка

Метод console.log(test); в конце функции create очень полезен для отладки. Он выведет в консоль браузера полную структуру созданного объекта TileSprite. Там вы найдете все его свойства: width, height, tilePositionX, tileScaleY и многие другие. Это прямой путь к пониманию внутреннего состояния объекта.

Ключевое отличие от Sprite — свойства tilePosition и tileScale. Они управляют не положением самого спрайта на сцене, а положением и масштабом *внутренней текстуры* внутри его области. Например, изменяя tilePositionX, вы можете прокручивать текстуру, создавая эффект движущегося фона, при этом сам спрайт остается на месте.

// Прокрутка текстуры вправо на каждом кадре
function update() {
    test.tilePositionX += 1;
}

Когда использовать TileSprite?

Используйте TileSprite в следующих сценариях:

1. **Фоны:** Для создания больших, бесшовных задних планов (трава, небо, вода). 2. **Крупные объекты:** Для рисования длинных дорог, стен или платформ из небольшой текстуры сегмента. 3. **Прокручиваемые элементы:** Благодаря отдельному управлению tilePosition легко анимировать текстуру для эффекта течения воды или движения облаков.

Избегайте его, если вам нужен одиночный, уникальный спрайт без повторения текстуры — для этого есть обычный Sprite.

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

TileSprite — это мощный и производительный инструмент для работы с повторяющимися текстурами в Phaser. Он позволяет создавать большие визуальные области из маленьких изображений, экономя ресурсы и упрощая анимацию фонов. **Идеи для экспериментов:** 1. Измените tileScaleX и tileScaleY, чтобы растянуть или сжать саму текстуру внутри спрайта, независимо от его общего масштаба. 2. Создайте бесконечно прокручивающийся фон в методе update(), изменяя tilePosition. 3. Попробуйте использовать setOrigin() для смещения точки вращения и масштабирования тайлспрайта.