О чем этот пример
Render Texture в Phaser 3 — это мощный инструмент для отрисовки графики в реальном времени, который можно использовать как собственный холст внутри игры. В этом примере мы рассмотрим, как управлять встроенной камерой Render Texture для применения сложных трансформаций — поворота, масштабирования и смещения — к отпечатанному на ней спрайту. Этот подход полезен для создания динамических эффектов, интерфейсов или предварительной обработки графики без прямого изменения исходных игровых объектов.
Версия 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('bunny', 'assets/sprites/bunny.png');
}
create ()
{
// Create a Render Texture at 0x0 which is 800x600 in size
const rt = this.add.renderTexture(400, 300, 800, 600);
rt.camera.setAngle(20);
rt.camera.setZoom(2);
rt.camera.setPosition(450, 350);
rt.stamp('bunny', null, 0, 0, { originX: 0, originY: 0 }).render();
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Что такое Render Texture и зачем ей камера?
Объект RenderTexture в Phaser — это специальный текстурированный дисплейный объект. В него можно "штамповать" другие игровые объекты (спрайты, текст, графику), а затем отображать эту комбинацию как единое целое. Каждая Render Texture имеет свою собственную камеру (rt.camera), которая управляет областью видимости и преобразованиями всего, что на ней отрисовано.
Это позволяет применять глобальные трансформации (поворот, зум, смещение) ко всему содержимому текстуры, не затрагивая оригинальные объекты в сцене. Это похоже на то, как если бы вы снимали фотографию объектов, а затем вращали и масштабировали уже саму фотографию.
Создание Render Texture и настройка камеры
В методе create() сцены создается экземпляр Render Texture. Ключевые параметры — это начальные координаты (x, y) и её размеры (width, height). В примере текстура создается в центре экрана.
const rt = this.add.renderTexture(400, 300, 800, 600);
Сразу после создания мы получаем доступ к её камере и настраиваем три свойства:
1. setAngle(20) — поворачивает "видоискатель" камеры на 20 градусов. Всё содержимое будет отрисовано с этим поворотом.
2. setZoom(2) — устанавливает двукратное увеличение. Объекты внутри текстуры будут выглядеть в два раза крупнее.
3. setPosition(450, 350) — смещает точку, которую камера смотрит в координатах мира Render Texture. Это смещает "кадр" относительно содержимого.
rt.camera.setAngle(20);
rt.camera.setZoom(2);
rt.camera.setPosition(450, 350);
Штамповка объекта и применение трансформаций
Метод stamp() добавляет (отпечатывает) игровой объект в Render Texture. В данном случае мы штампуем изображение с ключом 'bunny'. Последний аргумент — объект конфигурации, где originX и originY установлены в 0. Это означает, что точка привязки спрайта 'bунни' (его левый верхний угол) будет помещена в координаты (0, 0) мира Render Texture.
rt.stamp('bunny', null, 0, 0, { originX: 0, originY: 0 });
Важный момент: вызов .render() в конце строки (хотя в данном конкретном примере он может быть избыточен, так как штамп уже вызывает перерисовку) явно указывает движку обновить текстуру после всех манипуляций. Все трансформации камеры (поворот на 20°, зум x2 и смещение обзора) применяются именно в момент этой финальной отрисовки содержимого текстуры на экран.
.render();
В результате на экране мы видим не просто спрайт кролика, а его версию, обработанную через виртуальную камеру Render Texture: увеличенную, повёрнутую и со смещённым центром.
Области применения и отличие от трансформаций спрайта
Почему бы просто не повернуть и не масштабировать сам спрайт bunny? Потому что подход с Render Texture даёт иные возможности:
* **Групповые трансформации:** Вы можете отштамповать на одну текстуру десятки объектов, и трансформации камеры применятся ко всем им одновременно, сохраняя их взаимное расположение. * **Эффекты постобработки:** Полученную текстуру можно использовать как источник для шейдеров, рисовать на ней частицы или применять другие эффекты к уже трансформированному изображению. * **Оптимизация:** Сложная композиция из множества объектов, отрендеренная один раз в текстуру, может быть дешевле для отрисовки в каждом кадре, чем рендеринг каждого объекта по отдельности, особенно если они статичны.
Трансформация через камеру Render Texture — это преобразование всего "мира" текстуры, а не отдельного элемента в нём.
Что попробовать дальше
Использование камеры Render Texture открывает путь к созданию сложных визуальных композиций и эффектов в Phaser 3. Вы можете анимировать свойства rt.camera (угол, зум, позицию) для создания плавных переходов, "дрожания" камеры для эффектов удара или реализовать мини-карту в углу экрана. Для экспериментов попробуйте заменить один спрайт 'bunny' на несколько, отштампованных в разных координатах, или анимируйте rt.camera.setPosition с помощью tweens, чтобы создать эффект панорамирования по отрисованной сцене.
