О чем этот пример
Работа с динамическими текстурами открывает мощные возможности для создания игрового контента на лету. В этом примере показано, как не только рисовать на текстуре, но и точечно очищать её части. Это полезно для создания интерактивных полотен, стираемых поверхностей, динамических аватаров или любых элементов, которые должны меняться в реальном времени без перезагрузки ресурсов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
bitmaptext;
rt;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.atlas('banner', 'assets/atlas/banners.png', 'assets/atlas/banners.json');
}
create ()
{
const GetRandom = Phaser.Utils.Array.GetRandom;
// Create our Dynamic Texture which is 512x512 in size
const banner = this.textures.addDynamicTexture('playerBanner', 512, 512);
// Draw a flag to our texture
banner.stamp('banner', 'flag_02_green', 256, 256);
// Now add the finished banner texture to a Sprite
this.add.sprite(400, 300, 'playerBanner');
banner.clear(100, 100, 100, 100);
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Создание динамической текстуры
В Phaser динамическая текстура (DynamicTexture) — это текстура в оперативной памяти, на которой можно рисовать с помощью Canvas API или специальных методов. Она создаётся с помощью метода this.textures.addDynamicTexture.
const banner = this.textures.addDynamicTexture('playerBanner', 512, 512);
Здесь мы создаём текстуру с именем 'playerBanner' размером 512x512 пикселей. Эта текстура сразу добавляется в менеджер текстур сцены и становится доступна для использования спрайтами.
Рисование на текстуре методом stamp
Метод stamp позволяет «штамповать» существующее изображение из атласа или обычной текстуры на динамическую текстуру. Это эффективный способ компоновки.
banner.stamp('banner', 'flag_02_green', 256, 256);
Параметры метода:
1. 'banner' — ключ загруженного атласа.
2. 'flag_02_green' — имя конкретного фрейма внутри этого атласа.
3. 256, 256 — координаты X и Y центра штампа на динамической текстуре.
После этого шага наша динамическая текстура 'playerBanner' содержит изображение зелёного флага по центру.
Использование текстуры в спрайте
Динамическая текстура ведёт себя как любая другая текстура в кеше. Мы можем создать спрайт, который будет использовать её в качестве источника изображения.
this.add.sprite(400, 300, 'playerBanner');
Этот спрайт отобразит всё текущее содержимое динамической текстуры 'playerBanner' на экране сцены. Любые последующие изменения текстуры (например, рисование или очистка) будут немедленно видны в этом спрайте.
Точечная очистка прямоугольной области
Ключевой метод в этом примере — clear. Он позволяет очистить прямоугольную область динамической текстуры, делая её полностью прозрачной.
banner.clear(100, 100, 100, 100);
Параметры метода clear(x, y, width, height):
- `x,y` — координаты левого верхнего угла очищаемого прямоугольника **относительно самой динамической текстуры**.
- width, height — размеры очищаемого прямоугольника.
В данном примере будет очищена квадратная область 100x100 пикселей, начинающаяся с точки (100, 100) на текстуре. Если на этой области находилась часть нарисованного флага, она исчезнет, и спрайт на сцене мгновенно обновится, отобразив «дырку».
Что попробовать дальше
Метод clear для DynamicTexture — это простой, но мощный инструмент для манипуляции содержимым текстур в реальном времени. Поэкспериментируйте: создайте «стираемую» картину, очищая области по клику мыши, или реализуйте систему кастомизации, где игрок может удалять элементы с шаблона. Можно комбинировать clear с другими методами рисования, такими как fill или draw, для создания сложных интерактивных эффектов.
