В библиотеке Phaser возможность создавать текстуры на лету с помощью Canvas открывает широкие возможности для динамической графики, процедурной генерации объектов и кастомных эффектов. Canvas предоставляет прямой доступ к пиксельным данным и методам рисования 2D, что позволяет создавать сложные спрайты без необходимости использования готовых изображений.
Для создания текстуры из Canvas используется объект
Phaser.Textures.CanvasTexture. Основная последовательность
действий:
let canvasTexture = this.textures.createCanvas('myCanvas', 256, 256);
'myCanvas' — уникальный ключ текстуры.256, 256 — размеры холста в пикселях.let ctx = canvasTexture.getContext();
Контекст (ctx) является стандартным
CanvasRenderingContext2D, что позволяет использовать все
методы рисования HTML5 Canvas.
ctx.fillStyle = '#ff0000';
ctx.fillRect(0, 0, 256, 256);
canvasTexture.refresh();
Метод refresh() обязателен после изменения контекста,
иначе внесённые изменения не отобразятся в Phaser.
Созданную текстуру можно использовать как спрайт или любой другой объект, поддерживающий текстуры:
let sprite = this.add.image(400, 300, 'myCanvas');
Преимущество подхода заключается в возможности изменять текстуру динамически, что особенно полезно для:
Canvas-текстуры в Phaser можно обновлять на каждом кадре. Например, анимация движения объекта внутри Canvas:
let canvasTexture = this.textures.createCanvas('dynamicCanvas', 128, 128);
let ctx = canvasTexture.getContext();
let x = 0;
this.time.addEvent({
loop: true,
callback: () => {
ctx.clearRect(0, 0, 128, 128);
ctx.fillStyle = '#00ff00';
ctx.beginPath();
ctx.arc(x, 64, 20, 0, Math.PI * 2);
ctx.fill();
canvasTexture.refresh();
x += 2;
if (x > 128) x = 0;
}
});
this.add.image(400, 300, 'dynamicCanvas');
Ключевой момент: вызов refresh() после каждого изменения
является обязательным для отражения изменений на сцене.
Canvas позволяет создавать графику по алгоритмам без готовых ресурсов. Примеры применения:
let canvasTexture = this.textures.createCanvas('noise', 128, 128);
let ctx = canvasTexture.getContext();
for (let i = 0; i < 128; i++) {
for (let j = 0; j < 128; j++) {
let gray = Math.floor(Math.random() * 256);
ctx.fillStyle = `rgb(${gray},${gray},${gray})`;
ctx.fillRect(i, j, 1, 1);
}
}
canvasTexture.refresh();
this.add.image(400, 300, 'noise');
let canvasTexture = this.textures.createCanvas('gradient', 200, 200);
let ctx = canvasTexture.getContext();
let gradient = ctx.createLinearGradient(0, 0, 200, 200);
gradient.addColorStop(0, 'blue');
gradient.addColorStop(1, 'yellow');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 200, 200);
canvasTexture.refresh();
this.add.image(400, 300, 'gradient');
Phaser.GameObjects.Particles.ParticleEmitter.clearRect вместо создания нового
Canvas: снижает количество аллокаций памяти.Canvas-текстуры совместимы с:
Image и Sprite — для статичных и
анимированных объектов;TileSprite — для создания динамически изменяемых
фонов;RenderTexture — для сложных композиций, где Canvas
может использоваться как промежуточный слой.Прямой доступ к пикселям через getImageData и
putImageData позволяет реализовывать:
Эта функциональность делает Phaser мощным инструментом для генеративной графики, динамических эффектов и визуализации данных, предоставляя прямой контроль над пикселями и возможность создания уникальных игровых объектов без зависимости от внешних ресурсов.