资产节点图
资产节点图负责设计导出;导出窗口负责执行导出。资产步骤把精灵列表变成文件,而它的做法是一个节点图:精灵列表输入,排列到精灵表上,再作为文件输出。这是三种连线,它们不会混淆——列表必须先排列才能接入精灵表,精灵表也不能打标签。
它的输入是「精灵」节点(以及用于外部图片的图像文件节点),每个都带入精灵列表:某台摄像机看到的某个动作,用某个风格绘制,带某个部件组,切分成帧,包含每个图层。「精灵」节点固定地指明这一切:窗口标题栏中的选择不属于它,所以资产写出的内容从不取决于当前恰好显示的是什么。它的输出是每个文件一个节点。「精灵表」节点是内存中的一张精灵表:它在节点上显示精灵表,但什么都不写出。每个文件都是从它连出的一个文件节点——精灵表本身用 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,新建的「精灵」节点、项目初始的资产管线以及新项目都使用它):动作列表中除「静止」以外的每个动作,「静止」即站立不动的静止姿势——当项目没有其他动作时(静态模型),仍然使用「静止」,这样木箱也有精灵。 - 每一个(留空,或
*):每个动作,包括「静止」。 - 按名称指定的动作,包括「静止」:只用该动作,或多个动作(
pxr graph set中的walk, attack)。当「精灵」节点指定模型的某个片段时,无论它是否是项目的动作都会被绘制——一旦指定,它的帧就总会出现在节点的预览图中、它所输出的内容中以及导出结果中。
指向不存在之物的名称(在别处被删除或重命名的动作)会在节点上用浅白的话说明:South 看不到 Sway 的任何帧:请在「精灵」节点上选择项目中存在的动作和摄像机。
切分方式显示在它的节点上和检查器中:
- 帧/秒(
fps):每隔若干秒一帧,未指定时为每秒 12 帧。 - 保留帧数(
smart):这么多智能取帧,像动画师那样挑选——运动转折处的姿势,运动快的地方多留几帧,每帧停留到下一帧为止。0 为关闭。节点表面上的智能取帧用于开启,使用帧/秒恢复为均匀间隔。 - 选定帧(
picked):手动选取的时间,单位为秒。选中「精灵」节点时,资产节点图后面的时间轴会显示它的帧:点击关键帧条可以添加或删除一帧,也可以沿着它拖动关键帧(每次操作为一步撤销)。节点面板上会显示时间轴上选定了 N 帧。
有选定帧时优先使用选定帧,其次是保留帧,然后是每秒帧数。添加到节点图中的「精灵」节点,起初按节点图中第一个「精灵」节点的方式切分。由节点或关键帧构成的动作按其自身的帧切分。时间轴帧计数器旁的停留(ms)设置当前显示帧的停留时长(见让某一帧停留更久):这属于动作,所以每个使用该片段的「精灵」节点都会保留它。这些都不会改变动作步骤:它播放完整的运动,精灵帧落在切分时的时间点上。
在「精灵」节点和「排列」之间放置切分列表的节点:
| 节点 | 作用 |
|---|---|
| 帧范围 | 只取输入中从 from 到 to 的帧,从 0 开始计数:把攻击的蓄力单独作为一个列表,把 idle 的一帧作为图标,把一个列表分到两张精灵表上。范围会保留每帧原本的内容——它在片段中的时间、部件组、根运动位移。范围的范围按输入计数;循环的一部分不再循环;超出末尾的范围保留最后一帧。 |
| 停留 | 每帧停留的时长乘以这么多倍: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 视图则继续播放该范围。每个文件节点在导出前就显示其文件,由导出所用的同一个写入器生成:节点上显示它的预览图,选中节点时 2D 视图显示完整内容——PNG 或贴图显示为图像,GIF、APNG 或视频直接播放,JSON、Godot 文件或文本文件显示为文本,ZIP 显示为其包含的文件列表。写出多个文件的节点(每个片段一个 GIF、每个文件一个图层)在视图上方有一个文件列表。
快速文件与生成
生成快的内容随节点图变化即时显示;生成慢的则等待其节点的生成(D51)。快的:列表与文件之间的所有内容、精灵表,以及 PNG 图像、JSON、Godot SpriteFrames、调色板、文本文件、自发光贴图、阴影图层和线稿与平涂图层。慢的:每个片段一个 GIF、APNG 和视频,Aseprite 文件,法线贴图和深度图,调色板变体,灯光套件,PICO-8 卡带,报告,ZIP 压缩包,动画文件和图标——这些都要重新编码每一帧或重新渲染。(纸娃娃图层和视差图层是单独的渲染:由导出窗口生成。)
生成较慢的节点会显示生成,而不是它的文件。按下后,文件会在后台生成——按钮变成加载动画,你可以继续工作——然后节点显示它的预览图,2D 视图显示该文件,按钮变为重新生成。修改任何为它提供输入的内容后,节点会保留已生成的内容,但会显示已过期,而不会重新生成:按重新生成,或按打开(会先生成)。
生成的文件
生成和打开生成的是真实的文件,位于当前项目的临时文件夹中(在系统临时文件夹下,以 pixor-generated- 加项目名命名),每条资产管线一个文件夹,每个节点一个文件夹。工具栏上的生成的文件可以打开它。它会自行清理:删除节点会删除它的文件,删除资产管线会删除它的文件夹,关闭项目或退出 Pixor 会删除整个文件夹;崩溃遗留的文件夹会在下次启动 Pixor 时被删除。它们永远不是导出写出的内容:导出窗口会重新写出每个文件。
所选节点的设置也显示在检查器中——什么都没选时,则显示节点图自身的「精灵表」节点的设置。在那里的精灵表设置下方,它能写出的每种文件都是一个开关:勾选 JSON 或每个片段一段视频,就会添加对应的「文件」节点,并从精灵表连线过来;取消勾选则将其移除。这样只需点几下就能设置好导出,无需碰任何连线,而它仍然是一张节点图:每个开关都是一个看得见的节点,有自己的设置。
节点
N 对 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(最远的)到最后一层。每个图层只有在某个图层节点指明它时才会由 pxr render 渲染——应用的导出窗口运行的就是它。分离列表的图层:每个图层用一个图层节点,各自连到自己的精灵表;合并它们:用合并、叠放或叠加节点。 |
| 帧范围 | 帧 × 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 绘制——像素、法线、碰撞框和根运动都会镜像。对称的模型不必渲染另一侧。 |
| 标签 | 帧 × N | 帧 × N | 行是否循环(保留、是或否),以及它们自己的轴心点(x,y,以单元格像素计),用于站姿不同的片段。不循环的片段在 JSON 和 .aseprite 中是只播放一次的标签;轴心点写在 JSON 的每一帧上,也是轴心点切片的一个关键帧。 |
| 排列 | 帧 × N | 精灵表 × N | 每个列表在精灵表上的排布:网格或条带、内边距、边缘扩展、2 的幂、裁切、重复帧只存一次、换行的最大宽度、最大高度(超过后精灵表分成多页,每页放完整的片段,各有一套文件),以及每行帧数——像联系表一样,让每个片段紧接在上一个之后排列。 |
| 放置 | 精灵表 × N | 精灵表 × N | 每张精灵表移到图像上的某个位置。 |
| 叠放 | sheet,sheet | 精灵表 | 把两张精灵表合为一张,第二张位于第一张下方或旁边,中间留有间隙。 |
| 叠加 | 底部,顶部 | 精灵表 | 一张精灵表精确叠放在另一张上,就像引擎叠放图层那样:上层的空白像素会显示下层。每个图层都可以关闭,以便单独查看另一个。两者必须逐帧对齐——相同的帧位于相同的位置——否则导出时会指出哪一帧没有对齐。 |
| 精灵表 | 精灵表 | 文件 | 内存中的一张精灵表。它本身不写入任何文件:它的文件是从它接出的「文件」节点。名为是它的名称。 |
| 文件 | 精灵表 | 文件 | 输出:磁盘上的一个文件,由接入它的精灵表写出,节点面板上有它自己的设置,打开用于打开它的文件,当它生成较慢时还有生成按钮。PNG 图像(精灵表本身,以及它的文件名称:文件写入,PNG 写入的路径,其他文件沿用它的名称,位于导出窗口指定的文件夹下;文件名,帧的命名模板,下方显示它生成的第一个名称;文件中的配方,文件是否记录其制作方式;自己的文件为精灵表指定独立的路径、名称和配方,关闭时,文件写到项目的导出位置——检查器在显示精灵表时也会显示这些设置)、JSON、Aseprite 文件、Godot SpriteFrames、法线贴图、深度图、自发光贴图、线稿和平涂图层、调色板、灯光套件、PICO-8 卡带、报告;每个片段一个 GIF 和每个片段一个 APNG(比例);每个片段一段视频(比例、每秒帧数、背景);阴影图层(接触或投射);调色板变体(变体列表);纸娃娃图层(分块);视差图层(图层、远处图层加雾)。删除精灵表会删除它的文件节点。 |
| 文本文件 | 精灵表 | 文件 | 输出:用模板遍历各帧生成的文本文件(见下文)。 |
| 动画文件 | 帧 | 文件 | 输出:接入的每个精灵列表各生成一段动画,中间不经过精灵表: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 就是这样做的。第二张精灵表在接入自己的列表之前,使用与第一张相同的输入。每张都有自己的路径、名称模板和配方,或者沿用项目的;它旁边的文件——以及它们的阴影、变体和比例——都是它的文件节点。当两张都沿用项目的设置时,第一张写出项目的精灵表,下一张以自己的名称写在旁边(名为 icons 的精灵表写成 out/hero_icons.png),因此不会重复写出;两张各自指定同一个路径时会被拒绝,并列出两者的名称。从脚本添加的精灵表会取一个其他输出都没有用过的名称(sheet 2),与应用中一样,pxr names 会按渲染时使用的名称列出这些文件。
视图、俯仰角、尺寸和外观相同的摄像机会一起取景并写出一张精灵表,每台一行:一圈摄像机的各个朝向会对齐。设置不同的摄像机写出自己的精灵表,「精灵」节点取正在写出的那一组的行。指定了两个组的摄像机(South, top)的「精灵」节点会把它们汇集到一个文件中,在所有摄像机都渲染完后写出,放在项目精灵表旁边,以其「精灵表」节点的名称命名(out/hero_both.png);行以其摄像机命名(walk_South、walk_top)。一张精灵表只有一种帧尺寸和一套调色板,所以取景尺寸不同的摄像机会被拒绝,而不是硬塞在一起:请给它们相同的尺寸。
一个图标网格只需三个节点:一个取摄像机 South 的 idle 动作的精灵节点、一个排成条带的排列,以及一个 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 风格绘制的 walk 会单独取景,因此它在这些文件旁边写出自己的精灵表: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 与颜色帧的不同之处在于图层,而这正是它们的本质。没有写 {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}(根运动,与 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都是「精灵表」和「文件」节点;模板写出的是文本。 - 没有插件二进制文件,也没有脚本节点,这里和其他节点图一样。

