О чем этот пример
TileSprite — мощный игровой объект в Phaser 3 для создания бесшовных фонов, анимированных текстур и эффектов прокрутки. В отличие от обычного спрайта, его текстура может "замостить" область любого размера, что экономит ресурсы и открывает простор для творчества. Эта статья разбирает официальный пример, наглядно демонстрирующий создание TileSprite и применение к нему ключевых трансформаций: изменение точки вращения (origin), масштабирование, прозрачность и режимы наложения. Вы научитесь контролировать отрисовку плиточных спрайтов с пиксельной точностью.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
test7;
test6;
test5;
test4;
test3;
test2;
test1;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
this.load.image('pic', 'assets/sprites/space-baddie.png');
}
create ()
{
this.add.image(0, 0, 'grid').setOrigin(0);
// Test 1
// Render object at given coordinates
this.test1 = this.add.tileSprite(400, 50, 192, 32, 'pic').setOrigin(0.5);
// Test 2
// Render object at given coordinates factoring in origin 1
this.test2 = this.add.tileSprite(400, 150, 192, 32, 'pic').setOrigin(1, 0.5);
// Test 3
// Render object at given coordinates factoring in origin 0
this.test3 = this.add.tileSprite(400, 150, 192, 32, 'pic').setOrigin(0, 0.5);
// Test 4
// Render object with scale
this.test4 = this.add.tileSprite(400, 250, 192, 32, 'pic').setOrigin(0.5).setScale(2);
// Test 5
// Render object with rotation
this.test5 = this.add.tileSprite(400, 350, 192, 32, 'pic').setOrigin(0.5);
// Test 6
// Render object with alpha
this.test6 = this.add.tileSprite(400, 450, 192, 32, 'pic').setOrigin(0.5).setAlpha(0.5);
// Test 7
// Render object with blend mode
this.test7 = this.add.tileSprite(400, 550, 192, 32, 'pic').setOrigin(0.5).setBlendMode(1);
}
update ()
{
this.test5.rotation += 0.01;
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Что такое TileSprite и зачем он нужен?
Объект TileSprite (плиточный спрайт) создается с помощью метода this.add.tileSprite(x, y, width, height, textureKey). Его ключевая особенность — текстура, переданная в последнем аргументе, будет повторяться (замоститься) внутри заданной прямоугольной области ширины width и высоты height. Это идеально для создания больших фоновых слоев, бесконечно прокручивающихся в игре, без необходимости использовать огромные изображения.
В примере в качестве текстуры загружено небольшое изображение 'pic' (космический пришелец), которое затем используется для создания нескольких тестовых объектов шириной 192 пикселя и высотой 32 пикселя.
Точка отсчета: магия свойства Origin
Свойство origin определяет точку привязки спрайта внутри его собственной системы координат. По умолчанию оно равно (0.5, 0.5) — центр объекта. Все трансформации (позиционирование, вращение, масштабирование) происходят относительно этой точки.
В первых трех тестах показано, как origin влияет на позиционирование. Все спрайты создаются с одинаковой X-координатой 400, но визуально располагаются по-разному.
// Test 1: Origin = (0.5, 0.5) - центр
this.test1 = this.add.tileSprite(400, 50, 192, 32, 'pic').setOrigin(0.5);
// Test 2: Origin = (1, 0.5) - правый центр
this.test2 = this.add.tileSprite(400, 150, 192, 32, 'pic').setOrigin(1, 0.5);
// Test 3: Origin = (0, 0.5) - левый центр
this.test3 = this.add.tileSprite(400, 150, 192, 32, 'pic').setOrigin(0, 0.5);
* **Test 1:** Центр спрайта (origin 0.5) помещен в точку (400, 50). Спрайт симметрично располагается вокруг этой точки.
* **Test 2:** Точка привязки смещена в правый центр спрайта (origin 1, 0.5). Поэтому правый край спрайта теперь находится в точке (400, 150).
* **Test 3:** Точка привязки в левом центре (origin 0, 0.5). Теперь левый край спрайта находится в точке (400, 150). Test 2 и Test 3 созданы на одной Y-координате, но из-за разного origin они не накладываются друг на друга.
Масштабирование, вращение и прозрачность
Как и любой игровой объект в Phaser, TileSprite поддерживает стандартные методы трансформации и визуальных эффектов, которые применяются ко всей плиточной области.
// Test 4: Масштабирование в 2 раза
this.test4 = this.add.tileSprite(400, 250, 192, 32, 'pic').setOrigin(0.5).setScale(2);
// Test 5: Вращение (анимируется в update)
this.test5 = this.add.tileSprite(400, 350, 192, 32, 'pic').setOrigin(0.5);
// Test 6: Полупрозрачность (alpha = 0.5)
this.test6 = this.add.tileSprite(400, 450, 192, 32, 'pic').setOrigin(0.5).setAlpha(0.5);
* **Test 4:** Метод .setScale(2) увеличивает и ширину, и высоту спрайта в 2 раза относительно его origin (центра). Исходный размер 192x32 становится 384x64, и текстура внутри также масштабируется.
* **Test 5:** Вращение задается свойством rotation. В методе update() каждый кадр к нему прибавляется 0.01 радиана, создавая плавную анимацию вращения вокруг центра (origin = 0.5).
* **Test 6:** Метод .setAlpha(0.5) устанавливает прозрачность спрайта на 50%. Значение 0 — полностью прозрачный, 1 — полностью непрозрачный.
Эксперименты с режимами наложения (Blend Modes)
Режимы наложения (Blend Modes) определяют, как пиксели спрайта смешиваются с пикселями под ним. В Phaser они задаются числовыми константами.
// Test 7: Применение режима наложения (ADD)
this.test7 = this.add.tileSprite(400, 550, 192, 32, 'pic').setOrigin(0.5).setBlendMode(1);
В данном примере используется режим `1, который соответствуетPhaser.BlendModes.ADD` (аддитивное наложение). Этот режим складывает значения цветов спрайта и фона, создавая эффект свечения или осветления. Это особенно полезно для создания эффектов огня, лазеров, света или энергетических полей на основе плиточных текстур.
Для других режимов можно использовать константы, например: Phaser.BlendModes.MULTIPLY, Phaser.BlendModes.SCREEN.
Что попробовать дальше
TileSprite в Phaser — это гибкий инструмент, выходящий за рамки простых фонов. Контроль над origin позволяет точно позиционировать и вращать объект, а стандартные методы вроде setScale, setAlpha и setBlendMode открывают путь к созданию сложных визуальных эффектов.
**Идеи для экспериментов:**
1. Анимируйте свойства tilePositionX и tilePositionY в update(), чтобы создать эффект бесконечно движущегося фона.
2. Скомбинируйте несколько TileSprite с разными режимами наложения (Blend Modes) для создания сложных слоевых эффектов.
3. Используйте очень узкий или широкий TileSprite с вращением для создания радиальных или спиральных узоров.
