О чем этот пример
Работа с динамическими текстурами — ключ к созданию гибкой графики в играх. Этот пример демонстрирует, как можно изменять размер текстуры на лету с помощью `CanvasTexture`. Вы научитесь создавать текстуры в реальном времени, управлять их размерами и обновлять отображение спрайтов, что полезно для интерфейсов, спецэффектов или прототипирования игровых элементов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Demo extends Phaser.Scene
{
constructor()
{
super();
}
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.spritesheet('swatch', 'assets/swatches/deluxe-paint-swatch.png', { frameWidth: 512, frameHeight: 16 });
}
create ()
{
const ct = this.textures.createCanvas('ct1', 3, 1);
const sprite = this.add.sprite(400, 300, 'ct1');
let width = 16;
let height = 16;
ct.setSize(width, height);
ct.drawFrame('swatch', 1);
this.input.on('pointerdown', () => {
width += 16;
// height += 16;
ct.setSize(width, height);
sprite.setSize(width, height);
ct.update();
ct.refresh();
console.log(ct.width, ct.height);
ct.drawFrame('swatch', 1);
console.log(sprite.width, sprite.height);
});
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
backgroundColor: '#000000',
scene: Demo
};
const game = new Phaser.Game(config);
Что такое CanvasTexture и зачем она нужна
В Phaser CanvasTexture — это текстура, создаваемая на основе HTML5 Canvas. Она позволяет рисовать графику программно, а не загружать из файлов. Это идеально для динамических элементов, таких как индикаторы здоровья, генерируемые карты или эффекты частиц.
В примере мы создаём текстуру 'ct1' размером 3x1 пикселя, хотя это лишь начальное значение — позже мы изменим её. Спрайт использует эту текстуру для отображения.
Создание и настройка текстуры
В методе create() происходит инициализация CanvasTexture. Сначала текстура создаётся с минимальным размером, а затем сразу увеличивается до 16x16 пикселей. Ключевой метод здесь — drawFrame, который копирует кадр из спрайтшита 'swatch' на холст текстуры.
const ct = this.textures.createCanvas('ct1', 3, 1);
const sprite = this.add.sprite(400, 300, 'ct1');
let width = 16;
let height = 16;
ct.setSize(width, height);
ct.drawFrame('swatch', 1);
setSize изменяет размер холста текстуры, а drawFrame рисует в него первый кадр спрайтшита (индекс 1).
Динамическое изменение размера по клику
При клике мыши размер текстуры увеличивается на 16 пикселей по ширине. Важно не только изменить размер текстуры, но и обновить связанный спрайт, чтобы изменения отразились на экране.
this.input.on('pointerdown', () => {
width += 16;
ct.setSize(width, height);
sprite.setSize(width, height);
ct.update();
ct.refresh();
ct.drawFrame('swatch', 1);
});
setSize для текстуры меняет размер её холста, а setSize для спрайта обновляет его визуальное представление. Методы update и refresh гарантируют, что текстура перерисуется. После этого drawFrame снова заполняет текстуру данными из спрайтшита, растягивая изображение под новый размер.
Важные нюансы работы с CanvasTexture
При изменении размера CanvasTexture нужно помнить:
- update перерисовывает текстуру, учитывая текущие изменения на холсте.
- refresh обновляет внутренний кэш текстуры, чтобы движок Phaser использовал актуальные данные.
- Если не вызвать setSize для спрайта, его размер останется прежним, даже если текстура изменилась.
Консольный вывод в примере помогает отслеживать реальные размеры текстуры и спрайта:
console.log(ct.width, ct.height);
console.log(sprite.width, sprite.height);
Это полезно для отладки, чтобы убедиться, что изменения применяются корректно.
Что попробовать дальше
Динамическое управление CanvasTexture открывает возможности для создания адаптивной графики в играх. Поэкспериментируйте: добавьте изменение высоты, используйте разные спрайтшиты или анимируйте размер текстуры со временем. Можно создать интерактивный индикатор загрузки или генератор случайных текстур для процедурного контента.
