Граф ассета
В графе ассета экспорт проектируется, а в окне экспорта — запускается. Шаг «Ассет» превращает списки спрайтов в файлы, и делает это граф: списки спрайтов входят, раскладываются на листе и выходят как файлы. Это три типа связей, и их нельзя перепутать: список нельзя подключить к «Листу», не расположив его, а лист нельзя пометить тегом.
Его входы — узлы Спрайты (и узлы Файл изображения для изображений извне), каждый из которых приносит списки спрайтов: действие, увиденное камерой, нарисованное Стилем, с набором частей, нарезанное на кадры, со всеми слоями. Узел «Спрайты» задает их все жестко: выбор в заголовке окна на него не влияет, поэтому то, что пишет ассет, никогда не зависит от того, что сейчас показано. Его выходы — по одному узлу на файл. Узел «Лист» — это спрайт-лист в памяти: он показывает лист на себе и ничего не записывает. Каждый файл — узел Файл, подключенный к нему: PNG-изображение для самого листа, затем его JSON, его .aseprite, его Godot SpriteFrames, его карта нормалей. Чтобы экспортировать спрайт-лист, соедините «Лист» → PNG. В графе может быть столько узлов каждого вида, сколько файлов нужно записать проекту.
Все, что можно задать экспорту, находится на узлах, кроме папки назначения: она задается в окне «Экспорт», которое перечисляет все файлы, которые граф туда запишет, по имени и виду, до того как вы нажмете «Экспорт», — самый быстрый способ увидеть, что изменение графа делает с файлами. Как называются кадры листа — задается на его PNG-узле (и в Инспекторе вместе с его «Листом»), раскладка — на питающем его «Расположить», а каждый другой файл, который он пишет, — с собственными параметрами этого файла: масштаб GIF, частота видео, какая тень, какие варианты палитры — это узел «Файл», подключенный к нему. Проект, который никогда не переподключает граф, ничего из этого не хранит: это один лист из всех списков спрайтов.
Изображение может показывать любой слой. Здесь, под изображением «Листа», Слой выбирает слой, который оно рисует, — пока не задано, тот, что рисует собственный Слой 2D-вида, — спрайт, его линии, плоские цвета, нормали, глубину, свечение, дополнительный выход Стиля — или Каждый слой сразу: у кадра — рядом, у списка — по строке на слой.
Это исходный граф — конвейер ассета Основной:
Sprites (every action except Static) → Arrange → Sheet (sheet) → PNG image
Выбор в заголовке окна
Действие, Стиль и Ассет — независимые конвейеры, у каждого свой граф. В правом конце строки вкладок рабочих пространств — четыре выбора: Камера, Действие, Стиль, Ассет — после «Воспроизведение/Пауза»: по одному выбору каждого вида для всех шагов.
| Шаг | Рисует |
|---|---|
| Действие | выбранное действие глазами выбранной камеры |
| Стиль | выбранное действие глазами выбранной камеры, нарисованное выбранным Стилем |
| Ассет | то, что называют узлы «Спрайты» его собственного графа, — а не выбор в заголовке |
Список «Стили» (шаг «Стиль») и список «Ассеты» (шаг «Ассет») — это тот же выбор, что и селекторы «Стиль» и «Ассет» в заголовке: щелчок в любом из них показывает одно и то же. Окно экспорта открывается с конвейером ассета, выбранным в селекторе «Ассет» в заголовке, и записывает только его; его файлы называются так же, как при записи всех конвейеров ассета (pxr render --pipeline all записывает их все).
Откуда берутся списки спрайтов
Списки спрайтов создаются здесь, узлами Спрайты, и только здесь: какие действия попадут в листы — это то, что берут узлы «Спрайты», и ничто иное. Узел «Спрайты» называет камеру, действие, Стиль и набор частей и хранит нарезку: как движение действия превращается в кадры.
Его Действие — одно из:
- Все, кроме Статики (
every-one-except-static— то, что берут новый узел «Спрайты», конвейер ассета, с которого начинается проект, и новый проект): каждое действие из списка действий, кроме Static — неподвижной позы покоя; но Static берется, если в проекте нет других действий (неподвижная модель), так что у ящика все равно есть спрайт. - Все (пусто или
*): каждое действие, включая Статику. - Действие по имени, в том числе Static: только это действие или несколько (
walk, attackизpxr graph set). Клип модели рисуется, когда его называет узел «Спрайты», независимо от того, входит ли он в действия проекта, — если он назван, его кадры всегда есть: в изображении узла, в том, что он питает, и в экспорте.
Имя, за которым ничего нет (действие удалено или переименовано в другом месте), отображается на узле простыми словами: No frames of Sway seen by South: choose an action and a camera the project has on the Sprites node.
Нарезка — на лицевой стороне узла и в Инспекторе:
- Кадр/с (
fps): один кадр через заданное число секунд, 12 в секунду, пока не задано иное. - Оставлено кадров (
smart): столько умных кадров, выбранных так, как выбрал бы аниматор, — позы, где движение поворачивает, больше там, где оно быстрое, каждый удерживается до следующего. 0 — выключено. Умные кадры на лицевой стороне включают их, Взять кадры/с возвращает равномерный шаг. - Выбранные кадры (
picked): моменты в секундах, выбранные вручную. Когда выбран узел «Спрайты», Таймлайн за графом ассета показывает его кадры: щелкните по полосе ключей, чтобы добавить или удалить кадр, или перетащите ключ вдоль нее (каждое действие — один шаг отмены). На узле написано N frames picked on the timeline.
Выбранные кадры, если они есть, имеют приоритет, затем сохраненные кадры, затем кадры в секунду. Узел «Спрайты», добавленный в граф, сначала нарезается так же, как первый в графе. Действие из узлов или ключей нарезается по собственным кадрам. Удержание (ms) рядом со счетчиком кадров таймлайна задает удержание показанного кадра (см. удержание одного кадра дольше) — у действия, так что каждый узел «Спрайты», берущий этот клип, его сохраняет. Шаг «Действие» от этого не меняется: он проигрывает все движение целиком, а кадр спрайта попадает на время, в которое был нарезан.
Между узлом «Спрайты» и «Расположить» стоят узлы, которые нарезают список:
| Узел | Что делает |
|---|---|
| Диапазон кадров | Только кадры с from по to из входящего, считая от 0: замах атаки как отдельный список, один кадр покоя как иконка, список на два листа. Диапазон сохраняет то, что показывал каждый кадр, — его время в клипе, набор частей, перемещение корня. Диапазон диапазона считается во входящем; часть цикла больше не зацикливается; диапазон за концом сохраняет последний кадр. |
| Удержание | Каждый кадр удерживается во столько раз дольше: 2 проигрывает список вдвое медленнее. |
Sprites (South, attack, Pixel Art, smart 6) → Frame range (2 to 5) → Hold (×2) → Arrange → Sheet → PNG image
Выбор узла «Спрайты», «Диапазон кадров» или «Удержание» заставляет 2D-вид проигрывать список, который он выдает, нарезанный, разделенный и разложенный по слоям так, как он будет записан. Ни один из этих узлов не требует рендера: они решают, какие кадры куда идут, еще до появления первого пикселя.
Чтобы использовать цепочку снова, выберите «Спрайты» → «Диапазон кадров» → «Удержание» и сгруппируйте их (Ctrl+G), затем «Сохранить набор…» сохранит группу как набор узлов в разделе «Мои узлы»; или сохраните весь конвейер ассета как набор (см. Конвейеры ассетов).
Рендеры и названия их файлов
Рендер — это кадрирование, Стиль и то, как нарезан каждый клип. Узлы «Спрайты» используют один рендер, пока они согласны: тот же Стиль, общее кадрирование и ни один клип не нарезан двумя способами. Поэтому ходьба с частотой 8 кадров в секунду и атака, выбранная вручную, — это один рендер и один лист. Второй узел, который нарезает ходьбу умными кадрами или рисует ее другим Стилем, — отдельный рендер.
Первый рендер записывает файлы так, как их называет граф. Следующий записывается рядом с ними под словами, которыми он отличается от первого: его камера, имя его Стиля, затем нарезка каждого клипа, который он нарезает иначе, — 8fps (или 12_5fps), smart6, picked4 (четыре кадра, выбранные вручную). Так получаются out/hero.png, затем out/hero_smart6.png и out/hero_Pixel_Art_2_8fps.png, каждый на палитре своего Стиля. pxr names перечисляет файлы каждого рендера с кадрами, которые оставляет «Диапазон кадров», и отклоняет два рендера, которые записали бы один файл, — например, две разные ручные нарезки по четыре кадра одного клипа, — еще до начала рендера: would be written twice.
Из скрипта:
pxr graph add game.pixor --which asset --node sprites --set action=attack --set smart=6 # node 4, merged in by node 5
pxr graph add game.pixor --which asset --node frame-range --set from=2 --set to=5 --alone --in frames=4 # node 6
pxr graph add game.pixor --which asset --node hold --set times=2 --alone --in frames=6 # node 7
pxr graph wire game.pixor --which asset --from 7 --to 5 --slot frames2 # the cut attack into the Merge, in place of node 4
pxr graph set game.pixor --which asset --node frame-range --set to=6
pxr project set game.pixor --add-style portrait
pxr graph add game.pixor --which asset --node sprites --set action=walk --set style=portrait --set fps=8
pxr names game.pixor
«Диапазон кадров» и «Удержание» стоят между узлом «Спрайты» атаки и «Слить», поэтому нарезают только атаку. Добавленные без --alone, они встали бы перед «Расположить», после «Слить», и нарезали бы все списки, которые объединяет «Слить».
pxr render --fps 8, --smart-frames 6 и --keys 0,0.25,0.5 задают нарезку всех узлов «Спрайты» сразу. Запуск шаблона проекта через pxr run game.pixorblueprint --set hold.times=4 доходит до узла «Удержание» каждого конвейера ассета, а --set icons/hold.times=4 — только конвейера icons.
Панель
Когда граф сохранен, 2D-вид над ним показывает, что записывает выбранный выход — его выборки, блоки, места, стопки и наложения, — нарисованные тем же кодом, что пишет файл; до этого там по ряду на действие и сторону, которые можно перетаскивать, меняя порядок.
Граф ассета — панель шага «Ассет» под 2D-видом, на том же холсте, что и граф сцены: блоки, связи, параметры на лицевой стороне каждого узла, плюс, чтобы добавить узел в подключенную цепочку, минус, чтобы удалить, Кадр, чтобы увидеть все, Упорядочить, чтобы разложить заново, Заметка, чтобы прикрепить заметку, Группа, чтобы объединить выбранные узлы в группу, и Сохранить набор…, чтобы сохранить выбранную группу или, если ничего не выбрано, весь граф как набор (Сохранить граф ассета как набор), — панель, которая есть у каждого графа, с клавишами, которые есть у каждого графа (Работа в нем). Его библиотека узлов слева перечисляет Входы и Выходы, Конвейеры проекта и Мои конвейеры, затем Промежуточные и ваши собственные наборы в разделе Мои узлы. Правый клик по холсту › Вернуть один лист возвращает его к одному листу с прежними файлами. Иконки записывает иконки инвентаря. Строка внизу сообщает, что записывает граф. Созданные файлы, первая кнопка на панели, открывает папку созданных файлов в файловом менеджере.
У каждого файлового узла есть Открыть: открывает файл этого узла в приложении, которым ваша система открывает такие файлы, — лист в редакторе изображений, .aseprite в Aseprite, видео в плеере, архив в архиваторе (подсказка называет, в каком). Файл, который еще не создан или устарел, сначала создается, а на Открыть тем временем крутится индикатор загрузки.
Каждый параметр узла ассета — это свойство (см. Узлы): строка с портом слева, которую задают на узле или подключают от значения. Удалить удаляет выбранный узел, как и минус; последний пишущий узел остается.
Каждый узел между списками и файлами показывает то, что передает дальше, разложенным на листе: узел «Слой» — свой слой, «Диапазон кадров» — свои кадры, «Отразить» — свое отражение, «Расположить» — свой лист. Изображение показывает все, что называют его узлы «Спрайты», что бы ни показывал заголовок окна: каждую камеру, действие и Стиль, из каждого рендера, в котором они нарисованы. Камеры, кадрированные отдельно (другой вид, наклон или размер), другой Стиль или клип, нарезанный иначе, — это отдельные рендеры, записываемые в отдельные листы; изображение, которое питают несколько таких, раскладывает по блоку на каждый лист под именем файла, в который тот пишется (hero.png, затем hero_top.png), со строками как у этого листа. Рендеры, которые 2D-вид не показывает, рисуются в фоне, один за другим, и хранятся, пока проект не изменится. Один узел никогда не останавливает изображение другого: каждое раскладывается только из того, что его питает, а узел, который не может этого сделать, — файл изображения еще не выбран, «Слить» без подключений — пишет почему красным там, где было бы его изображение, как и узлы, которые он питает, а остальные сохраняют свои. Изображения раскладываются из каждого списка, нарисованного целиком: пока выбранный «Диапазон кадров» или «Удержание» заставляет 2D-вид проигрывать свой единственный список, они сохраняют списки, нарисованные целиком в последний раз, а узел, добавленный в это время, получает изображение из них. Когда тем временем меняется то, из чего они нарисованы, — часть, скрытая в «Структуре», материал, лампа, — они перерисовываются в фоне за 2D-видом, который продолжает проигрывать диапазон. Каждый файловый узел показывает свой файл еще до экспорта, созданный тем же писателем, что и при экспорте: его изображение на узле и целиком в 2D-виде, когда узел выбран, — PNG или карта как изображение, GIF, APNG или видео в воспроизведении, JSON, файл Godot или текстовый файл как текст, а ZIP как список содержимого. У узла, который пишет несколько файлов (GIF на клип, слой на файл), над видом есть список Файл.
Быстрые файлы и «Создать»
То, что создается быстро, показывается по мере изменения графа; медленное ждет кнопки «Создать» своего узла (D51). Быстро: все между списками и файлами, «Лист», а также изображение PNG, JSON, SpriteFrames Godot, «Палитра», «Текстовый файл», «Карта свечения», «Слой теней» и «Слои линий и заливки». Медленно: «GIF на клип», «APNG на клип» и «Видео на каждый клип», файл Aseprite, карты нормалей и глубины, «Варианты палитры», «Набор света», «Картридж PICO-8», «Отчет», «Архив ZIP», «Файл анимации» и «Иконки» — то, что заново кодирует каждый кадр или рендерит. (Слои бумажной куклы и параллакса — отдельные рендеры: их создает окно экспорта.)
Медленный узел показывает «Создать» вместо своего файла. После нажатия файл создается в стороне — кнопка превращается в индикатор загрузки, а вы продолжаете работать, — затем узел показывает свое изображение, 2D-вид — файл, а на кнопке написано «Создать заново». Измените что-нибудь из того, что его питает, и узел сохранит созданное, но вместо повторного создания напишет «Устарело»: нажмите «Создать заново» или «Открыть», который сначала создает файл.
Созданные файлы
То, что создают Создать и Открыть, — настоящие файлы, во временной папке открытого проекта (внутри системной временной папки, с именем pixor-generated- и названием проекта): папка на конвейер ассета и папка на узел. Созданные файлы на панели открывает ее. Она очищается сама: удаление узла удаляет его файлы, удаление конвейера ассета — его папку, а закрытие проекта или выход из Pixor — всю папку; папка, оставшаяся после сбоя, удаляется при следующем запуске Pixor. Это никогда не то, что записывает экспорт: окно экспорта записывает каждый файл заново.
Параметры выбранного узла тоже находятся в Инспекторе, а если ничего не выбрано — параметры «Листа» самого графа. Там, под параметрами «Листа», каждый файл, который он может записать, — это переключатель: включение JSON или Видео на каждый клип добавляет соответствующий узел файла, соединенный с листом, а выключение удаляет его. Так экспорт настраивается в несколько щелчков, не трогая ни одной связи, и при этом остается графом: каждый переключатель — это узел, который видно, со своими параметрами.
Узлы
Узлы N x N. «Слой», «Диапазон кадров», «Удержание», «Отразить», «Тег», «Расположить» и «Размещение» делают одно и то же со всеми подключенными к ним списками и возвращают каждый на отдельном выходе напротив его входа: один узел «Слой» берет нормали четырех списков спрайтов и передает дальше четыре списка. Свободный вход для следующего всегда есть. «Слить» работает наоборот: сколько угодно списков на входе, один на выходе.
| Узел | Принимает | Выдает | Что делает |
|---|---|---|---|
| Спрайты | — | кадры | Вход. Списки спрайтов, заданные здесь, что бы ни показывал заголовок окна: при нескольких сценах — выбранная Сцена (или каждая); выбранная Камера (или каждая) — камера — это сторона; выбранное Действие (Все, кроме Статики, Все или одно по имени, включая Статику), нарисованные выбранным Стилем (пока не задано — первым в проекте) и нарезанные так, как говорят его Кадр/с, Оставлено кадров или Выбранные кадры (см. откуда берутся списки спрайтов). Камера и действие также принимают из pxr graph set список через запятую (South, East, North) или начало имени и * для кольца (turret*). Набор частей проекта рендерит каждый клип заново с этим набором, включенным во всех кадрах (снаряжение, состояния повреждений). Каждый слой идет вместе со списком; узел «Слой» выбирает один, а без него лист состоит из готового спрайта. |
| Файл изображения | — | кадры | Вход: изображение извне как отдельный список спрайтов: PNG — один кадр или полоса либо сетка, нарезанная на кадры Ширина кадра на Высота кадра, каждый удерживается Каждый кадр, — или GIF с его кадрами, их задержками и признаком цикла. Название — имя его строки. Изображение принимает палитру листа (каждый пиксель — ближайший цвет; то, что прозрачно больше чем наполовину, пусто) и центрируется в ячейке; кадр больше ячейки отклоняется с указанием обоих размеров. Оно попадает на листы, к которым подключен его узел, и ни на какие другие. |
| Слить | кадры, … | кадры | Все подключенные списки как один: много списков спрайтов на одном листе. |
| Слой | кадры × N | кадры × N | Один слой каждого списка: final, lines или flat, либо одна из карт, которыми игра освещает спрайт, — normal, depth, emission, — из-за чего лист, куда она попадает, становится изображением в цветах, а не в индексах палитры, — либо shadow, тень, которую отбрасывает каждый кадр, черным цветом (та, что задана параметром проекта Тень, иначе контактная тень), которую Наложение кладет под спрайт; либо имя одного из дополнительных выходов графа стиля — тогда его ряды называются по нему (idle_South_rim). Собственные изображения рендера — тоже слои: с реквизитом или элементами — base бумажной куклы и каждый элемент по имени (idle_South_helmet); со слоями параллакса — от layer0 (самого дальнего) до последнего. Каждый рендерится, только когда его называет узел Layer, командой pxr render — именно ее запускает окно «Экспорт» приложения. Разделяйте слои списка узлом Layer на каждый слой, каждый в свой «Лист»; объединяйте их узлами «Слить», «Стопка» или «Наложение». |
| Диапазон кадров | кадры × N | кадры × N | Кадры каждого списка с from по to, считая от 0: from=3 to=3 для статичного кадра или иконки (новый — from=0 to=0, первый кадр), from=2 to=5 для нескольких. Разделите список на несколько листов с помощью Диапазона кадров на каждую часть. |
| Удержание | кадры × N | кадры × N | Каждый кадр каждого списка удерживается в times раз дольше. |
| Отразить | кадры × N | кадры × N | Каждый список, отраженный слева направо, вместо другой камеры: узел «Спрайты» стороны East, отраженный как West, — это walk_West, построенный из walk_East, с отражением пикселей, нормалей, хитбоксов и root motion. Симметричной модели не нужно рендерить другую сторону. |
| Тег | кадры × N | кадры × N | Зациклены ли строки (Оставить, Да или Нет), и собственная опорная точка (x,y в пикселях ячейки) для клипа, который стоит иначе. Незацикленный клип — это тег, который проигрывается один раз в JSON и в .aseprite; опорная точка есть в каждом кадре JSON и в ключе среза опорной точки. |
| Расположить | кадры × N | лист × N | Каждый список на листе: сетка или полоса, отступ, выдавливание краев, степень двойки, обрезка, повторяющиеся кадры хранятся один раз, максимальная ширина для переноса строк, максимальная высота, после которой лист делится на страницы (на странице только целые клипы, у каждой свой набор файлов), и кадров в строке — тогда каждый клип идет сразу за предыдущим, как на контактном листе. |
| Размещение | лист × N | лист × N | Каждый лист перемещен на свое место в изображении. |
| Стопка | лист, лист | лист | Два листа как один: второй под первым или рядом с ним, с промежутком. |
| Наложение | низ, верх | лист | Один лист, наложенный точно поверх другого, как движок складывает слои: сквозь пустые пиксели верхнего виден нижний. Каждый слой можно выключить, чтобы увидеть другой отдельно. Они должны совпадать кадр в кадр — те же кадры на тех же местах, — иначе экспорт сообщит, какой кадр не совпадает. |
| Лист | лист | файл | Спрайт-лист в памяти. Он ничего не записывает: его файлы — это узлы «Файл», подключенные к нему. Название — его имя. |
| Файл | лист | файл | Выход: один файл на диске, записанный из «Листа», с которым он соединен, со своими параметрами на самом узле, кнопкой «Открыть», чтобы открыть файл, и «Создать», когда он создается медленно. «Изображение PNG» (сам лист и то, как называются его файлы: «Куда записать файлы» — путь, по которому пишется PNG и чье имя берут остальные, внутри папки, заданной окну экспорта; «Файл: имена» — шаблон имен его кадров, под которым показано первое созданное имя; «Рецепт в файлах» — хранят ли файлы то, как они созданы; «Собственные файлы» дает листу собственные путь, имена и рецепт, а если выключено, его файлы идут туда, куда экспортирует проект, — Инспектор показывает это и вместе с «Листом»), JSON, «Файл Aseprite», «SpriteFrames Godot», «Карта нормалей», «Карта глубины», «Карта свечения», «Слои линий и заливки», «Палитра», «Набор света», «Картридж PICO-8», «Отчет»; «GIF на клип» и «APNG на клип» («Масштаб»); «Видео на каждый клип» («Масштаб», «Кадров в секунду», «Фон»); «Слой теней» (contact или drop); «Варианты палитры» (их список); «Слои бумажной куклы» («Детали»); «Слои параллакса» («Слои», «Дымка дальних слоев»). Удаление «Листа» удаляет его узлы файлов. |
| Текстовый файл | лист | файл | Выход: текстовый файл по шаблону над кадрами (ниже). |
| Файл анимации | кадры | файл | Выход: анимация каждого подключенного списка спрайтов, без листа между ними: GIF, APNG или несжатое видео («Каждый список как»), увеличенное в «Масштаб» раз, видео с частотой «Кадров в секунду» поверх «Фон». «Куда» задает начало имени каждого файла: out/spin записывает out/spin_walk_South.gif. |
| Иконки | — | файл | Выход: иконки инвентаря модели, с ракурса ¾ при студийном свете, с обводкой цвета «Редкость» (или «Из имени файла»), «В кадре» или нет, в каждом из размеров «Размеры»: PNG на иконку, а также атлас и JSON-индекс на размер — в папку «Куда». Иконка — отдельный рендер, поэтому ничего не принимает; pxr создает их после листов в папке экспорта. См. иконки инвентаря. |
| Архив ZIP | файл, … | файл | Выход: ZIP из файлов подключенных к нему файловых узлов (Куда — место назначения): подключенный Лист — это все, что этот лист записывает; а если ничего не подключено — из всех файлов, записанных экспортом. Слои бумажной куклы и параллакса идут вместе с остальным. Одни и те же файлы дают один и тот же архив, байт в байт. Это то, что передают другому человеку или загружают в магазин. |
План, а не рендер. Граф решает, какие кадры куда идут, еще до появления первого пикселя, поэтому шаг «Ассет» работает и при пустом шаге «Стиль», а pxr names выводит все имена и id, которые запишет граф, без рендера.
Кадры сохраняют свою идентичность. Перекомпоновка листа перемещает прямоугольники и не трогает id ни одного кадра (см. Как называются кадры и что они собой представляют).
Конвейеры ассетов
В проекте может быть сколько угодно конвейеров ассета, у каждого свой граф ассета под своим именем — лист персонажа, набор иконок, кадры для страницы магазина, — и окно «Экспорт» записывает тот, который вы выберете (pxr render --pipeline all записывает все). Список Ассеты слева на шаге «Ассет» и выбор «Ассет» в заголовке определяют, какой из них на холсте. Новый конвейер ассета под списком создает копию показанного, названную по нему (Main 2), а контекстное меню строки переименовывает его, дублирует, удаляет (Удалить NAME… — сначала спрашивает; первый тоже, пока остается другой) и:
- «Сохранить набор…» («Сохранить конвейер ассета как набор») записывает конвейер как набор. Сохраненный в библиотеке конвейеров (там, где открывается диалог), он появляется в библиотеке узлов каждого проекта в разделе «Мои конвейеры».
- «Использовать набор…» («Использовать набор конвейера ассета») или щелчок по одному из них в разделе «Мои конвейеры» делает конвейер, сохраненный из другого проекта, собственным конвейером этого проекта. Его имена — конвейера, его листов, его файлов — делаются такими, каких здесь еще нет.
pxr project set game.pixor --add-pipeline icons
pxr graph set game.pixor --which asset --pipeline icons --node arrange --set layout=strip
pxr graph save game.pixor --which asset --pipeline icons --as-pipeline -o icons.pixorkit
pxr project set other.pixor --use-pipeline icons.pixorkit
pxr project set other.pixor --remove-pipeline icons
Изображения извне
Узел «Файл изображения» помещает на лист Pixor то, что нарисовано в другом месте: логотип на титульном листе, эффект, нарисованный вручную, кадры из другого инструмента. Добавьте его, «Выбрать…» PNG или GIF, и он присоединится к спискам спрайтов через «Слить»; подключите его к отдельному листу, чтобы держать отдельно.
pxr graph add game.pixor --which asset --node image-file --set name=logo --set file=art/logo.png
pxr graph add game.pixor --which asset --node image-file --set name=spark --set file=art/spark.gif
pxr graph list game.pixor --which asset # every node, numbered
pxr graph set game.pixor --which asset --node logo --set cell_w=16 --set cell_h=16 # a strip of 16 px frames
pxr graph set game.pixor --which asset --node logo --set own_colours=true # keep its colours
--node принимает номер узла из pxr graph list, его имя (logo) или его вид (frame-range), если в графе один узел такого вида.
Изображение берет палитру листа: каждый пиксель — ближайший из ее цветов. Отметьте «Собственные цвета», и оно сохранит свои: они добавляются в конец палитры листа (сначала самые частые, сколько поместится в палитру), поэтому их несет каждый файл листа — PNG, .aseprite, GIF, файлы палитры, — а вариант палитры оставляет их как есть. Собственные кадры листа не меняются.
Изображение больше ячейки увеличивает ячейки каждого файла, в который оно попадает: остальные кадры центрируются в увеличенных ячейках, а их опорная точка, хитбоксы и точки крепления сдвигаются вместе с ними.
Несколько файлов из одного рендера
В графе может быть несколько узлов «Лист», у каждого свой подключенный PNG: тогда один рендер записывает лист персонажа, набор иконок и промо-кадр. «Лист» без PNG не записывает изображения — только подключенные к нему файлы; так записывается один JSON листа. Второй «Лист» берет то же, что и первый, пока его не подключат к собственным спискам. У каждого свои путь, шаблон имен и рецепт или общие с проектом; файлы рядом с ним — и их тень, варианты и масштабы — это его узлы файлов. Если два листа берут общие с проектом, первый записывает лист проекта, а следующий — рядом под своим именем (out/hero_icons.png для листа с именем icons), поэтому ничего не записывается дважды; два листа, которые называют один и тот же собственный путь, отклоняются с указанием обоих имен. «Лист», добавленный из скрипта, получает имя, которого нет ни у одного другого выхода (лист 2), как и в приложении, а pxr names перечисляет файлы под теми именами, которые им дает рендер.
Камеры с одинаковыми видом, наклоном, размером и обликом кадрируются вместе и записывают один лист, по строке на каждую: стороны кольца выстраиваются ровно. Камера, настроенная иначе, пишет собственные листы, а узел «Спрайты» берет строки той группы, которая записывается. Узел «Спрайты», который называет камеры из двух групп — South, top, — собирает их в один файл, который записывается, когда отрендерены все камеры, рядом с листом проекта под именем его узла «Лист» (out/hero_both.png); строки называются по своим камерам (walk_South, walk_top). У одного листа один размер кадра и одна палитра, поэтому камеры, кадрирующие в разных размерах, отклоняются, а не сжимаются вместе: задайте им одинаковый размер.
Сетка иконок — это три узла: узел «Спрайты» действия idle с камеры South, «Расположить» в виде полосы и «Лист», чей PNG идет в out/icons.png. Контактный лист — то же самое с отступами. Это не функции, а графы.
Из скрипта:
pxr graph add game.pixor --which asset --node sprites --set action=idle --set camera=South --alone # node 11
pxr graph add game.pixor --which asset --node arrange --set layout=strip --alone --in frames=11 # node 12
pxr graph add game.pixor --which asset --node sheet --set name=icons --set path=out/icons.png --set formats=png --alone --in sheet=12
pxr graph set game.pixor --which asset --node icons --set formats=json,godot # its File nodes
pxr graph wire game.pixor --which asset --from 10 --to 12 --slot frames2 # the spark into the Arrange's spare input
pxr graph add game.pixor --which asset --node sheet --set name=sparks --set path=out/sparks.png --set formats=png --alone --in sheet=12.1 # output 1 of an N x N node
pxr graph list game.pixor --which asset # every node, and every output's path
pxr graph drop game.pixor --which asset --node logo # the logo's Image file node
pxr render game.pixor # out/game.png, out/icons.png (.json, .tres), out/sparks.png
Ходьба, нарисованная в Стиле portrait, нарезается отдельно, поэтому записывает собственные листы рядом с этими: out/game_portrait_8fps.png, а искра, у которой нет своего Стиля, — еще раз в out/sparks_South_portrait_8fps.png.
Числа взяты из пошагового примера на этой странице; pxr graph list выводит числа конкретного проекта. --alone не пускает сетку иконок в цепочку основного листа: список idle, тоже слитый в нее, дал бы одни и те же кадры дважды, а шаблон имени это запрещает.
pxr graph add вставляет узел в цепочку и подключает его: «Диапазон кадров» или «Удержание» — перед «Расположить», узел листа — после него, а второй узел «Спрайты» — рядом с первым через «Слить». --set для «Листа» принимает path, names и recipe; formats добавляет и удаляет его узлы файлов — PNG всегда среди них, как в собственном списке экспорта; чтобы не записывать ничего, удалите его узел, — а слова параметров, которые хранят его узлы файлов, создают и настраивают эти узлы: shadow=drop, variants=hit-flash,hue:120, anim_scale=4, paper_doll=yes, pieces=helmet:Helmet,Visor, parallax=3, haze=none. Собственные параметры узла файла задаются по его номеру: --node 5 --set fps=60.
Линии рядом с цветами
Лист может нести больше одного слоя тех же списков. Подключите узел «Спрайты» дважды — один раз напрямую, другой через «Слой» с lines — и либо объедините их через «Слить» перед одним «Расположить», либо расположите каждый и поставьте два листа рядом через «Стопку». JSON называет строки линий walk_South_lines, а их id отличаются от id цветных кадров слоем — ведь это и есть их различие. Шаблон, в котором нет {layer}, все равно добавляет его к именам этих кадров (hero_walk_South_00_lines.png), чтобы два кадра никогда не получили одно имя; собственные кадры спрайта сохраняют свои. Узел «Спрайты» с набором частей делает то же самое с {set} (hero_attack_South_00_bare.png), и набор входит в id этих кадров. Или наложите два слоя точно друг на друга через «Наложение», так, как их нарисует движок.
Текстовые файлы по шаблону
Движку, о котором Pixor никогда не слышал, нужен дескриптор, а это текстовый файл поверх тех же метаданных кадров, что несет JSON. Узел «Текстовый файл» записывает его по шаблону:
{sheet} {width}x{height}
{#frames}{name} {x} {y} {w} {h} {duration}{sep}
{/frames}
{#frames} ... {/frames} записывает свое тело один раз на каждый кадр. Вне его слова относятся к листу: {project}, {object}, {sheet} (имя файла изображения), {width}, {height}, {cell_w}, {cell_h}, {pivot_x}, {pivot_y}, {frames}. Внутри — к кадру: {name}, {id}, {action}, {side}, {row}, {index}, {n} (номер кадра на листе), {layer}, {x}, {y}, {w}, {h}, {source_x}, {source_y}, {duration} (миллисекунды), {pivot_x} и {pivot_y} (собственные значения клипа, если их задал «Тег»), {loop} (true или false), {root_x}, {root_y}, {root_dx} и {root_dy} (root motion, как в JSON), {boxes} и {sockets} (в виде JSON) и {sep} — запятая везде, кроме как после последнего кадра, чего достаточно для JSON-списка. {index:3} дополняет число нулями; {{ и }} записывают фигурную скобку.
Вместо этого шаблон может храниться в отдельном файле рядом с проектом: задайте узлу «Файл шаблона» (--set file=frames.tpl из скрипта), и он будет читаться при каждой записи выхода, поэтому студия правит свой дескриптор там же, где хранит остальные файлы.
Нет ни условий, ни арифметики, ни включений. Это способ записать файл, а не язык. Незнакомое Pixor слово отклоняется при вводе шаблона, а не записывается в файл.
Раскладка как одна группа
Сетка иконок, контактный лист, собственная раскладка персонажа, принятая в студии: «Сохранить набор…» на панели, когда группа не выбрана, сохраняет граф ассета как набор («Сохранить граф ассета как набор»): его раскладку и то, что питает его «Лист», — как одну группу, которая принимает списки спрайтов (каждый узел «Спрайты» становится входом) и выдает лист. «Лист» и висящие на нем файлы остаются в проекте. + › «Использовать набор…» («Добавить набор как группу») помещает его в граф ассета другого проекта как одну группу, чтобы подключить там к «Листу» или поставить вместо «Расположить». Дважды щелкните ее или нажмите стрелку на заголовке, чтобы открыть на месте; стрелка сворачивает ее снова. Из скрипта:
pxr graph save hero.pixor --which asset -o icon-grid.pixorkit --name "Icon grid"
pxr graph add villain.pixor --which asset --kit icon-grid.pixorkit --alone --in 0=0 # fed by node 0
pxr graph swap villain.pixor --which asset --node arrange --kit icon-grid.pixorkit
Чего он не делает
- Двоичные форматы остаются кодом. PNG,
.aseprite, GIF, APNG, GodotSpriteFrames, световые наборы и.p8— это узлы «Лист» и «Файл»; шаблон пишет текст. - Никаких бинарных плагинов и узлов-скриптов — здесь, как и в других графах.
То, что описано на этой странице, есть в полной версии; бесплатное демо в браузере ограничено обликом по умолчанию и PNG-листом.
Попробовать в браузере Получить Pixor
