Der Asset-Graph
Im Asset-Graphen wird ein Export entworfen; im Export-Fenster wird er ausgeführt. Der Asset-Schritt macht aus Sprite-Listen Dateien, und wie er das tut, ist ein Graph: Sprite-Listen kommen herein, werden auf einem Sheet angeordnet und gehen als Dateien hinaus. Das sind die drei Arten von Verbindungen, und sie lassen sich nicht verwechseln — eine Liste kann nicht mit einem Sheet verbunden werden, ohne vorher angeordnet zu sein, und ein Sheet kann nicht getaggt werden.
Ihre Eingänge sind Sprites-Nodes (und Bilddatei-Nodes für Bilder von außen), die jeweils Sprite-Listen hereinbringen: eine Action, von einer Kamera gesehen, mit einem Style gezeichnet, mit einem Teile-Set, in Frames geschnitten, mit jeder Ebene. Eine Sprites-Node nennt sie alle, fest: Die Auswahl im Fensterkopf ist nicht ihre, sodass das, was ein Asset schreibt, nie davon abhängt, was gerade angezeigt wird. Ihre Ausgaben sind eine Node pro Datei. Eine Sheet-Node ist ein Sprite-Sheet im Speicher: Sie zeigt das Sheet auf ihrer Fläche und schreibt nichts. Jede Datei ist eine Datei-Node, die damit verbunden ist – PNG-Bild für das Sheet selbst, dann sein JSON, seine .aseprite, seine Godot-SpriteFrames, seine Normal Map. Um ein Sprite-Sheet zu exportieren, verbinde Sheet → PNG. Ein Graph darf von jeder so viele haben, wie das Projekt Dateien zu schreiben hat.
Alles, was man einem Export sagen kann, steht auf einer Node, außer in welchen Ordner er geht: Das ist Sache des Export-Fensters, das jede Datei auflistet, die der Graph dort schreiben wird, nach Name und Art, bevor du auf Exportieren drückst – der schnellste Weg zu sehen, was eine Änderung am Graphen mit den Dateien macht. Wie die Frames eines Sheets heißen, steht auf seiner PNG-Bild-Node (und im Inspektor mit seinem Sheet), sein Layout auf dem Anordnen, das es speist, und jede andere Datei, die es schreibt – mit den eigenen Einstellungen dieser Datei: die Skalierung eines GIFs, die Rate eines Videos, welcher Schatten, welche Paletten-Varianten –, ist eine Datei-Node, die von ihm verbunden ist. Ein Projekt, das den Graphen nie umverbindet, speichert keinen: Es ist ein Sheet aus jeder Sprite-Liste.
Ein Bild kann jede Ebene zeigen. Unter dem Bild eines Sheets wählt hier Ebene die Ebene, die es zeichnet – bis es eine gesagt bekommt, die, die die eigene Ebene der 2D-Ansicht zeichnet –: das Sprite, seine Linien, seine flachen Farben, seine Normalen, Tiefe, Emission, eine Zusatzausgabe eines Styles – oder Jede Ebene auf einmal: die eines Frames nebeneinander, die einer Liste je eine Zeile.
Das ist der Graph, mit dem du beginnst, die Asset-Pipeline Haupt:
Sprites (every action except Static) → Arrange → Sheet (sheet) → PNG image
Die Auswahl im Fensterkopf
Action, Style und Asset sind unabhängige Pipelines, jede ein eigener Graph. Das rechte Ende der Zeile mit den Arbeitsbereich-Tabs enthält vier Auswahlfelder – Kamera, Action, Style, Asset – nach Abspielen/Pause: je eine Wahl, über alle Schritte hinweg.
| Stufe | Zeichnet |
|---|---|
| Action | die gewählte Action, von der gewählten Kamera gesehen |
| Style | die gewählte Action, von der gewählten Kamera gesehen, mit dem gewählten Style gezeichnet |
| Asset | was die Sprites-Nodes des eigenen Graphen nennen – nicht die Auswahl der Kopfzeile |
Die Styles-Liste (Style-Schritt) und die Assets-Liste (Asset-Schritt) bieten dieselbe Auswahl wie die Auswahlfelder Style und Asset in der Kopfzeile: Ein Klick in einem davon zeigt dasselbe. Das Export-Fenster beginnt mit der Asset-Pipeline, die im Asset-Auswahlfeld der Kopfzeile gewählt ist, und schreibt nur diese; ihre Dateien heißen so, als würde jede Asset-Pipeline geschrieben (pxr render --pipeline all schreibt sie alle).
Woher die Sprite-Listen kommen
Die Sprite-Listen entstehen hier, durch die Sprites-Nodes, und nur hier: Welche Actions in die Sheets kommen, ist das, was die Sprites-Nodes nehmen, sonst nichts. Eine Sprites-Node nennt eine Kamera, eine Action, einen Style und ein Teile-Set und enthält den Schnitt: wie die Bewegung der Action zu Frames wird.
Ihre Action ist eine von:
- Jede außer Statisch (
every-one-except-static, was eine neue Sprites-Node, die Asset-Pipeline, mit der ein Projekt beginnt, und ein neues Projekt nehmen): jede Action der Actions-Liste außer Statisch, der stillstehenden Ruhepose – trotzdem Statisch, wenn das Projekt keine andere Action hat (ein unbewegtes Modell), sodass auch eine Kiste ihr Sprite hat. - Jede (leer oder
*): jede Action, Statisch eingeschlossen. - Eine Action nach Namen, darunter Statisch: nur diese Action oder mehrere (
walk, attackauspxr graph set). Ein Clip des Modells wird gezeichnet, wenn eine Sprites-Node ihn nennt, ob er eine der Actions des Projekts ist oder nicht – genannt sind seine Frames immer da, im Bild der Node, in dem, was sie speist, und im Export.
Ein Name, der ins Leere zeigt (eine anderswo gelöschte oder umbenannte Action), wird auf der Node in klaren Worten genannt: Keine Frames von Sway gesehen von South: wähle auf der Sprites-Node eine Action und eine Kamera, die das Projekt hat.
Der Schnitt steht auf der Node und im Inspektor:
- Frames/s (
fps): ein Frame alle so viele Sekunden, 12 pro Sekunde, solange nichts anderes gesagt wird. - Behaltene Frames (
smart): so viele Smart Frames, gewählt, wie ein Animator es täte – die Posen, an denen die Bewegung umkehrt, mehr, wo sie schnell ist, jede bis zur nächsten gehalten. 0 ist aus. Smart Frames auf der Node schaltet sie ein, Frames/s verwenden kehrt zu einem gleichmäßigen Schritt zurück. - Gewählte Frames (
picked): Zeiten in Sekunden, von Hand gewählt. Ist die Sprites-Node ausgewählt, zeigt die Zeitleiste hinter dem Asset-Graphen ihre Frames: Klicke auf den Key-Streifen, um einen hinzuzufügen oder zu entfernen, oder ziehe einen Key daran entlang (je ein Rückgängig-Schritt). Auf der Node steht N Frames auf der Zeitleiste gewählt.
Gewählte Frames haben Vorrang, wenn es welche gibt, dann behaltene Frames, dann Frames pro Sekunde. Eine Sprites-Node, die einem Graphen hinzugefügt wird, ist anfangs so geschnitten wie die erste des Graphen. Eine Action aus Nodes oder Keys wird an ihren eigenen Frames geschnitten. Halten (ms) neben dem Frame-Zähler der Zeitleiste setzt das Halten des gezeigten Frames (siehe einen Frame länger halten): das der Action, sodass jede Sprites-Node, die den Clip nimmt, es behält. Am Schritt Action ändert nichts davon etwas: Er spielt die ganze Bewegung, und ein Sprite-Frame landet auf der Zeit, an der er geschnitten wurde.
Zwischen die Sprites-Node und das Anordnen kommen die Nodes, die eine Liste zerteilen:
| Node | Was sie tut |
|---|---|
| Frame-Bereich | Nur die Frames von bis bis des Hereinkommenden, gezählt ab 0: das Ausholen eines Angriffs als eigene Liste, ein Frame eines Idles als Icon, eine Liste über zwei Sheets. Ein Bereich behält, was jeder Frame zeigte – seine Zeit im Clip, sein Teile-Set, seinen Root-Weg. Ein Bereich eines Bereichs zählt im Hereinkommenden; ein Teil eines Loops loopt nicht mehr; ein Bereich über das Ende hinaus behält den letzten Frame. |
| Halten | Jeder Frame so viele Male so lange gehalten: 2 spielt die Liste mit halber Geschwindigkeit. |
Sprites (South, attack, Pixel Art, smart 6) → Frame range (2 to 5) → Hold (×2) → Arrange → Sheet → PNG image
Das Wählen einer Sprites-, Frame-Bereich- oder Halten-Node lässt die 2D-Ansicht die Liste abspielen, die sie liefert, geschnitten, zerlegt und in Ebenen, wie sie geschrieben wird. Keine dieser Nodes kostet einen Render: Sie entscheiden, welche Frames wohin gehen, bevor ein Pixel existiert.
Um eine Kette wiederzuverwenden, wähle Sprites → Frame-Bereich → Halten und gruppiere sie (Ctrl+G); dann speichert Kit speichern… die Gruppe als Node-Kit unter Meine Nodes; oder speichere die ganze Asset-Pipeline als Kit (siehe Asset-Pipelines).
Renders und wie ihre Dateien heißen
Ein Render ist ein Bildausschnitt, ein Style und die Art, wie jeder Clip geschnitten wird. Sprites-Nodes teilen sich einen Render, solange sie übereinstimmen: derselbe Style, gemeinsam eingepasst, und kein Clip auf zwei Arten geschnitten. Ein Gehzyklus mit 8 Frames pro Sekunde und ein von Hand gewählter Angriff sind also ein Render und ein Sheet. Eine zweite Node, die den Gehzyklus in Smart Frames schneidet oder mit einem anderen Style zeichnet, ist ein eigener Render.
Der erste Render schreibt seine Dateien so, wie der Graph sie benennt. Jeder weitere wird daneben geschrieben, unter den Wörtern, in denen er sich vom ersten unterscheidet: seine Kamera, der Name seines Styles, dann der Schnitt jedes Clips, den er anders schneidet – 8fps (oder 12_5fps), smart6, picked4 (vier von Hand gewählte Frames). Also out/hero.png, dann out/hero_smart6.png und out/hero_Pixel_Art_2_8fps.png, jeweils auf der Palette seines Styles. pxr names listet die Dateien jedes Renders mit den Frames, die ein Frame-Bereich behält, und lehnt zwei Renders ab, die dieselbe Datei schreiben würden – zwei verschiedene handgewählte Schnitte von vier Frames desselben Clips –, bevor irgendetwas rendert: would be written twice.
Aus einem Skript:
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
Frame-Bereich und Halten liegen zwischen der Sprites-Node des Angriffs und dem Zusammenführen, sodass sie nur den Angriff schneiden. Ohne --alone hinzugefügt, kämen sie vor das Anordnen, hinter das Zusammenführen, und würden jede Liste schneiden, die das Zusammenführen vereint.
pxr render --fps 8, --smart-frames 6 und --keys 0,0.25,0.5 setzen den Schnitt jeder Sprites-Node auf einmal. Ein mit pxr run game.pixorblueprint --set hold.times=4 ausgeführter Blueprint erreicht die Halten-Node jeder Asset-Pipeline, --set icons/hold.times=4 nur die der Pipeline icons.
Das Panel
Sobald ein Graph gespeichert ist, zeigt die 2D-Ansicht darüber, was die gewählte Ausgabe schreibt – ihre Takes, Blöcke, Plätze, Stapel und Überlagerungen –, gezeichnet vom selben Code, der die Datei schreibt; davor ist es eine Reihe pro Action und Seite, die du zum Umordnen ziehen kannst.
Asset-Graph ist ein Panel des Schritts Asset, unter der 2D-Ansicht, auf derselben Leinwand wie der Szenen-Graph: Boxen, Verbindungen, Einstellungen auf jeder Node, ein Plus, um eine Node in die verbundene Kette einzufügen, ein Minus, um eine zu löschen, Frame, um alles zu sehen, Aufräumen, um ihn neu anzuordnen, Notiz, um eine Notiz daraufzusetzen, Gruppe, um die gewählten Nodes zu einer Gruppe zu machen, und Kit speichern…, um die gewählte Gruppe oder, wenn keine gewählt ist, den ganzen Graphen als Kit zu behalten (Den Asset-Graphen als Kit speichern) – die Leiste, die jeder Graph hat, mit den Tasten, die jeder Graph hat (Damit arbeiten). Seine Node-Bibliothek links listet Eingänge und Ausgänge, die Pipelines des Projekts und Meine Pipelines, dann Zwischen und deine eigenen Kits unter Meine Nodes. Rechtsklick auf die Leinwand › Zurück zu einem Sheet setzt ihn auf ein Sheet mit den Dateien zurück, die er hatte. Icons schreibt Inventar-Icons. Die Zeile unten sagt, was der Graph schreibt. Erzeugte Dateien, als Erstes in der Leiste, öffnet den Ordner der erzeugten Dateien in deinem Dateimanager.
Jede Datei-Node hat Öffnen: Es öffnet die Datei dieser Node in der Anwendung, mit der dein System diese Dateiart öffnet – das Sheet in einem Bildeditor, die .aseprite in Aseprite, das Video in einem Player, das Archiv in einem Archivmanager (der Tooltip nennt welche). Eine Datei, die noch nicht erzeugt oder veraltet ist, wird zuerst erzeugt, solange mit einer Ladeanzeige auf Öffnen.
Jede Einstellung einer Asset-Node ist eine Eigenschaft (siehe Nodes): eine Zeile mit einem Anschluss links, auf der Node gesetzt oder von einem Wert verbunden. Löschen löscht die gewählte Node, wie das Minus; die letzte Node, die schreibt, bleibt.
Jede Node zwischen den Listen und den Dateien zeigt, was sie weitergibt, auf einem Sheet angeordnet: eine Ebene-Node ihre Ebene, ein Frame-Bereich seine Frames, ein Spiegeln seine Spiegelung, ein Anordnen sein Sheet. Ein Bild zeigt alles, was seine Sprites-Nodes nennen, egal was der Fensterkopf zeigt: jede Kamera, Action und jeden Style, aus jedem Render, in dem sie gezeichnet werden. Getrennt eingerahmte Kameras (andere Ansicht, Neigung oder Größe), ein anderer Style oder ein anders geschnittener Clip sind eigene Renders, in eigene Sheets geschrieben; ein Bild, das von mehreren gespeist wird, legt einen Block pro Sheet an, unter dem Namen der Datei, in die es geschrieben wird (hero.png, dann hero_top.png), mit seinen Zeilen wie die dieses Sheets. Die Renders, die die 2D-Ansicht nicht zeigt, werden dahinter gezeichnet, einer nach dem anderen, und behalten, bis sich das Projekt ändert. Eine Node hält nie das Bild einer anderen auf: Jede wird allein aus dem angeordnet, was sie speist, und eine Node, bei der das nicht geht – eine noch nicht gewählte Bilddatei, ein Zusammenführen ohne Verbindung –, sagt in Rot, wo ihr Bild wäre, warum, und ebenso die Nodes, die sie speist, während die anderen ihre behalten. Die Bilder werden aus jeder Liste angeordnet, vollständig gezeichnet: Während ein gewählter Frame-Bereich oder ein Halten die 2D-Ansicht seine eine Liste abspielen lässt, behalten sie die zuletzt vollständig gezeichneten Listen, und eine inzwischen hinzugefügte Node bekommt ihr Bild daraus. Wenn sich inzwischen etwas ändert, woraus sie gezeichnet werden – ein in der Gliederung ausgeblendetes Teil, ein Material, eine Lampe –, werden sie hinter der 2D-Ansicht neu gezeichnet, die den Bereich weiter abspielt. Jede Datei-Node zeigt ihre Datei, bevor sie exportiert wird, erzeugt vom selben Schreiber, den ein Export nutzt: ein Bild davon auf der Node, und das Ganze in der 2D-Ansicht, wenn die Node gewählt ist – ein PNG oder eine Map als Bild, ein GIF, ein APNG oder ein Video abspielend, eine JSON, eine Godot-Datei oder eine Textdatei als Text, und ein ZIP als Liste seines Inhalts. Eine Node, die mehrere Dateien schreibt (ein GIF pro Clip, eine Ebene pro Datei), hat über der Ansicht eine Datei-Liste.
Schnelle Dateien und Generieren
Was schnell zu erstellen ist, wird gezeigt, während sich der Graph ändert; was langsam ist, wartet auf das Erzeugen seiner Node (D51). Schnell: alles zwischen den Listen und den Dateien, das Sheet sowie PNG-Bild, JSON, Godot SpriteFrames, Palette, Textdatei, Emission Map, Schattenebene und Linien- und Flächenebenen. Langsam: GIF, APNG und Video pro Clip, die Aseprite-Datei, Normal Map und Tiefenkarte, Palettenvarianten, Licht-Kit, PICO-8-Cart, Bericht, ZIP-Archiv, Animationsdatei und Icons — was jeden Frame neu kodiert oder rendert. (Paper-Doll- und Parallaxe-Ebenen sind eigene Renders: Das Export-Fenster erstellt sie.)
Eine langsame Node zeigt Erzeugen statt ihrer Datei. Drückst du es, wird die Datei nebenher erstellt — die Schaltfläche wird zur Ladeanzeige, und du arbeitest weiter —, dann zeigt die Node ihr Bild, die 2D-Ansicht die Datei, und auf der Schaltfläche steht Neu erzeugen. Ändere irgendetwas, das sie speist, und die Node behält, was sie erstellt hat, sagt aber Veraltet, statt es neu zu erstellen: Drücke Neu erzeugen oder Öffnen, das zuerst erzeugt.
Erzeugte Dateien
Was Erzeugen und Öffnen erstellen, sind echte Dateien, in einem temporären Ordner des offenen Projekts (im temporären Ordner deines Systems, benannt nach pixor-generated- und dem Projekt), ein Ordner pro Asset-Pipeline und einer pro Node. Erzeugte Dateien in der Leiste öffnet ihn. Er räumt sich selbst auf: Eine Node zu löschen löscht ihre Dateien, eine Asset-Pipeline zu löschen ihren Ordner, und das Projekt zu schließen oder Pixor zu beenden den ganzen Ordner; ein Ordner, den ein Absturz hinterlassen hat, wird beim nächsten Start von Pixor entfernt. Sie sind nie das, was ein Export schreibt: Das Export-Fenster schreibt jede Datei neu.
Die Einstellungen der gewählten Node stehen ebenfalls im Inspektor – und ohne Auswahl die des eigenen Sheets des Graphen. Unter den Einstellungen eines Sheets ist dort jede Datei, die es schreiben kann, ein Schalter: JSON oder Video pro Clip anzuhaken fügt diese Datei-Node hinzu, mit dem Sheet verbunden, und Abhaken entfernt sie. So ist ein Export mit ein paar Klicks eingestellt, ohne eine Verbindung anzufassen, und es bleibt ein Graph: Jeder Schalter ist eine Node, die du sehen kannst, mit eigenen Einstellungen.
Die Nodes
N-x-N-Nodes. Ebene, Frame-Bereich, Halten, Spiegeln, Tag, Anordnen und Ablegen tun dasselbe mit so vielen Listen, wie mit ihnen verbunden sind, und geben jede an einem eigenen Ausgang gegenüber ihrem Eingang zurück: Eine Ebene-Node nimmt die Normalen von vier Sprite-Listen und gibt vier Listen weiter. Ein freier Eingang ist immer für den nächsten da. Zusammenführen geht andersherum: beliebig viele Listen hinein, eine heraus.
| Node | Nimmt | Liefert | Was sie tut |
|---|---|---|---|
| Sprites | — | Frames | Eingang. Sprite-Listen, hier festgelegt, egal was der Fensterkopf zeigt: bei mehreren Szenen die gewählte Szene (oder jede); die gewählte Kamera (oder jede) – eine Kamera ist eine Seite –, die gewählte Action (Jede außer Statisch, Jede oder eine nach Namen, Statisch eingeschlossen), gezeichnet mit dem gewählten Style (dem jeweils ersten des Projekts, solange nichts anderes gesagt wird), und geschnitten, wie ihre Frames/s, Behaltene Frames oder Gewählte Frames es sagen (siehe woher die Sprite-Listen kommen). Kamera und Action nehmen aus pxr graph set auch eine kommagetrennte Liste (South, East, North) oder den Anfang eines Namens und * für einen Ring (turret*). Ein Teile-Set des Projekts rendert jeden Clip erneut, mit diesem Set an über jeden Frame (Ausrüstung, Schadenszustände). Jede Ebene kommt mit der Liste; eine Ebene-Node wählt eine, und ohne eine ist das Sheet das des fertigen Sprites. |
| Bilddatei | — | Frames | Eingang: ein Bild von außen, als eigene Sprite-Liste: ein PNG – ein Frame oder ein Streifen oder Raster, in Frames von Frame-Breite mal Frame-Höhe geschnitten, jeder Jeder Frame lang gehalten – oder ein GIF, mit seinen Frames, ihren Verzögerungen und ob es sich wiederholt. Namens ist der Name seiner Zeile. Das Bild nimmt die Palette des Sheets an (jedes Pixel seine nächste Farbe; was mehr als halb transparent ist, ist leer) und wird in einer Zelle zentriert; ein Frame, der größer als eine Zelle ist, wird abgelehnt, mit beiden Größen. Es kommt auf die Sheets, mit denen seine Node verbunden ist, und auf kein anderes. |
| Zusammenführen | Frames, … | Frames | Jede verbundene Liste, als eine: viele Sprite-Listen auf einem Sheet. |
| Ebene | Frames × N | Frames × N | Eine Ebene jeder Liste: final, lines oder flat oder eine der Maps, mit denen ein Spiel das Sprite beleuchtet – normal, depth, emission –, was das Sheet, auf dem sie landet, zu einem Bild aus Farben statt Palettenindizes macht – oder shadow, der Schatten, den jeder Frame wirft, in Schwarz (der, den der Schatten des Projekts verlangt, sonst ein Kontaktschatten), den ein Überlagern unter das Sprite legt; oder der Name einer der zusätzlichen Ausgaben des Style-Graphen, deren Zeilen dann danach benannt werden (idle_South_rim). Die eigenen Bilder eines Renders sind auch Ebenen: mit Requisiten oder Stücken die base einer Paper Doll und jedes Stück beim Namen (idle_South_helmet); mit Parallaxe-Ebenen layer0 (die fernste) bis zur letzten. Jede wird nur gerendert, wenn eine Ebene-Node sie nennt, von pxr render – das ist, was das Export-Fenster der App ausführt. Trenne die Ebenen einer Liste mit einer Ebene-Node pro Ebene, jede in ihr eigenes Sheet; kombiniere sie mit einem Zusammenführen, Stapeln oder Überlagern. |
| Frame-Bereich | Frames × N | Frames × N | Frames from bis to jeder Liste, gezählt ab 0: from=3 to=3 für ein Standbild oder Icon (ein neuer ist from=0 to=0, der erste Frame), from=2 to=5 für ein paar. Teile eine Liste auf mehrere Sheets auf mit einem Frame-Bereich pro Teil. |
| Halten | Frames × N | Frames × N | Jeder Frame jeder Liste times-mal so lange gehalten. |
| Spiegeln | Frames × N | Frames × N | Jede Liste von links nach rechts gespiegelt, als Ersatz für eine andere Kamera: Eine Sprites-Node von East, gespiegelt als West, ist walk_West, gezeichnet aus walk_East – Pixel, Normalen, Hitboxen und Root Motion gespiegelt. Ein symmetrisches Modell muss seine andere Seite nicht rendern. |
| Tag | Frames × N | Frames × N | Ob die Zeilen sich wiederholen (Behalten, Ja oder Nein), und ein eigener Pivot (x,y in Zellpixeln) für einen Clip, der anders steht. Ein Clip, der sich nicht wiederholt, ist ein Tag, der in der JSON und der .aseprite-Datei einmal abgespielt wird; der Pivot steht in jedem Frame der JSON und ist ein Key des Pivot-Slices. |
| Anordnen | Frames × N | Sheet × N | Jede Liste auf einem Sheet: Raster oder Streifen, Abstand, Extrudieren, Zweierpotenz, Beschneiden, wiederholte Frames nur einmal gespeichert, eine maximale Breite, unter der Reihen umbrechen, eine maximale Höhe, ab der das Sheet in Seiten aufgeteilt wird (ganze Clips pro Seite, jede mit eigenem Dateisatz), und Frames pro Zeile, das jeden Clip wie ein Kontaktabzug nach dem letzten weiterlaufen lässt. |
| Ablegen | Sheet × N | Sheet × N | Jedes Sheet an eine Stelle des Bilds verschoben. |
| Stapeln | Sheet, Sheet | Sheet | Zwei Sheets als eines, das zweite unter oder neben dem ersten, mit einem Abstand. |
| Überlagern | unten, oben | Sheet | Ein Sheet exakt über ein anderes gelegt, so wie die Engine Ebenen stapelt: Die leeren Pixel des oberen zeigen das untere. Jede Ebene lässt sich ausschalten, um die andere allein zu sehen. Die beiden müssen Frame für Frame übereinstimmen – dieselben Frames an denselben Stellen –, sonst sagt der Export, welcher Frame es nicht tut. |
| Sheet | Sheet | Datei | Ein Sprite-Sheet im Speicher. Es schreibt nichts: Seine Dateien sind Datei-Nodes, die von ihm aus verbunden sind. Called ist sein Name. |
| Datei | Sheet | Datei | Ausgabe: eine Datei auf der Festplatte, geschrieben aus dem Sheet, mit dem sie verbunden ist, mit ihren eigenen Einstellungen auf ihrer Oberfläche, Öffnen, um ihre Datei zu öffnen, und Erzeugen, wenn sie langsam zu erstellen ist. PNG-Bild (das Sheet selbst und wie seine Dateien heißen: Dateien nach, der Pfad, den das PNG schreibt und dessen Namen die anderen übernehmen, unter dem Ordner, den das Export-Fenster bekommt; Dateinamen, die Vorlage, nach der seine Frames benannt werden, mit dem ersten erzeugten Namen darunter; Rezept in Dateien, ob die Dateien mitführen, wie sie entstanden sind; Eigene Dateien gibt dem Sheet einen eigenen Pfad, eigene Namen und ein eigenes Rezept, und wenn es aus ist, landen seine Dateien dort, wohin das Projekt exportiert — der Inspektor zeigt diese auch beim Sheet), JSON, Aseprite-Datei, Godot SpriteFrames, Normal Map, Tiefenkarte, Emission Map, Linien- und Flächenebenen, Palette, Licht-Kit, PICO-8-Cart, Bericht; GIF pro Clip und APNG pro Clip (Maßstab); Video pro Clip (Maßstab, Frames pro Sekunde, Hintergrund); Schattenebene (contact oder drop); Palettenvarianten (ihre Liste); Paper-Doll-Ebenen (Stücke); Parallaxe-Ebenen (Ebenen, Ferne Ebenen dunstig). Wer ein Sheet löscht, löscht seine Datei-Nodes. |
| Textdatei | Sheet | Datei | Ausgabe: eine Textdatei aus einer Vorlage über die Frames (unten). |
| Animationsdatei | Frames | Datei | Ausgabe: eine Animation jeder verbundenen Sprite-Liste, ohne Sheet dazwischen: ein GIF, ein APNG oder ein unkomprimiertes Video (Jede Liste als), Maßstab-mal größer, ein Video mit Frames pro Sekunde über Hintergrund. Bis beginnt den Namen jeder Datei: out/spin schreibt out/spin_walk_South.gif. |
| Icons | — | Datei | Ausgabe: Inventar-Icons des Modells, aus dem ¾-Winkel unter dem Studiolicht, umrandet in der Farbe der Seltenheit (oder Aus dem Dateinamen), Eingepasst oder nicht, in jeder der Größen: ein PNG pro Icon sowie ein Atlas und ein JSON-Index pro Größe, in den Ordner Bis. Ein Icon ist ein eigener Render, nimmt also nichts entgegen; pxr erzeugt sie nach den Sheets im Ordner des Exports. Siehe Inventar-Icons. |
| ZIP-Archiv | Datei, … | Datei | Ausgabe: ein ZIP aus den Dateien der damit verbundenen Datei-Nodes (To ist, wohin es geht) – ein verbundenes Sheet ist alles, was dieses Sheet schreibt – oder, wenn nichts verbunden ist, aus jeder Datei, die der Export geschrieben hat. Die Paper-Doll- und Parallaxe-Ebenen kommen mit dem Rest hinein. Dieselben Dateien ergeben dasselbe Archiv, Byte für Byte. Das, was an jemand anderen weitergegeben oder in einen Store hochgeladen wird. |
Ein Plan, kein Render. Der Graph entscheidet, welche Frames wohin gehen, bevor ein Pixel existiert, sodass der Schritt Asset mit leerem Schritt Style funktioniert, und pxr names gibt jeden Namen und jede ID aus, die der Graph schreiben wird, ohne zu rendern.
Frames behalten ihre Identität. Ein Sheet neu anzuordnen verschiebt Rechtecke und lässt die ID jedes Frames in Ruhe (siehe Wie die Frames heißen und was sie sind).
Asset-Pipelines
Ein Projekt hat so viele Asset-Pipelines, wie es will, jede ein eigener Asset-Graph unter ihrem Namen – das Sheet der Figur, ein Icon-Set, Standbilder für eine Shopseite –, und das Export-Fenster schreibt die, die du wählst (pxr render --pipeline all schreibt sie alle). Die Liste Assets links im Schritt Asset und die Asset-Auswahl im Kopf wählen die auf der Leinwand. Neue Asset-Pipeline unter der Liste erstellt eine Kopie der angezeigten, nach ihr benannt (Main 2), und das Rechtsklickmenü einer Zeile benennt sie um, dupliziert sie, löscht sie (NAME löschen…, das vorher fragt: auch die erste, solange eine andere übrig bleibt), und:
- Kit speichern… (Die Asset-Pipeline als Kit speichern) schreibt die Pipeline als Kit. In der Pipeline-Bibliothek gespeichert (wo sich der Dialog öffnet), erscheint sie in der Node-Bibliothek jedes Projekts unter Meine Pipelines.
- Kit verwenden… (Asset-Pipeline-Kit verwenden) oder ein Klick auf eines unter Meine Pipelines übernimmt eine aus einem anderen Projekt gespeicherte Pipeline in dieses Projekt. Ihre Namen — der der Pipeline, ihrer Sheets, ihrer Dateien — werden so gewählt, dass nichts hier sie schon hat.
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
Bilder von außen
Eine Bilddatei-Node bringt anderswo Gezeichnetes auf ein Pixor-Sheet: ein Logo auf ein Titel-Sheet, einen handgemalten Effekt, Frames aus einem anderen Tool. Füge sie hinzu, Wählen… ein PNG oder GIF, und sie stößt über ein Zusammenführen zu den Sprite-Listen; verbinde sie mit einem eigenen Sheet, um sie getrennt zu halten.
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 nimmt die Nummer einer Node aus pxr graph list, ihren Namen (logo) oder ihre Art (frame-range), wenn der Graph nur eine Node dieser Art hat.
Ein Bild übernimmt die Palette des Sheets: jedes Pixel die nächste ihrer Farben. Hake Eigene Farben an, und es behält stattdessen seine eigenen: Sie werden ans Ende der Palette des Sheets angehängt (die meistgenutzten zuerst, so viele, wie die Palette Platz hat), sodass jede Datei des Sheets — das PNG, die .aseprite, die GIFs, die Palettendateien — sie trägt, und eine Palettenvariante lässt sie, wie sie sind. Die eigenen Frames des Sheets ändern sich nicht.
Ein Bild, das größer als die Zelle ist, vergrößert die Zellen jeder Datei, in die es kommt: Die anderen Frames werden in den größeren Zellen zentriert, und ihr Pivot, ihre Hitboxen und Andockpunkte wandern mit.
Mehrere Dateien aus einem Render
Ein Graph kann mehrere Sheet-Nodes haben, jede mit einem davon verbundenen PNG: Ein Render schreibt dann ein Figuren-Sheet, ein Icon-Set und ein Werbebild. Ein Sheet ohne PNG schreibt kein Bild — nur die Dateien, die von ihm aus verbunden sind; so wird allein das JSON eines Sheets geschrieben. Ein zweites Sheet nimmt, was das erste nimmt, bis es mit eigenen Listen verbunden wird. Jedes hat einen eigenen Pfad, eine eigene Namensvorlage und ein eigenes Rezept oder übernimmt die des Projekts; die Dateien daneben — und ihr Schatten, ihre Varianten und Maßstäbe — sind seine Datei-Nodes. Übernehmen zwei die des Projekts, schreibt das erste das Sheet des Projekts und das nächste daneben unter seinem eigenen Namen (out/hero_icons.png für eines namens icons), damit nichts doppelt geschrieben wird; zwei, die einen eigenen Pfad gemeinsam nennen, werden mit beiden Namen abgelehnt. Ein per Skript hinzugefügtes Sheet heißt so, wie keine andere Ausgabe heißt (sheet 2), wie in der App, und pxr names listet die Dateien unter den Namen, die der Render ihnen gibt.
Kameras mit derselben Ansicht, Neigung, Größe und demselben Look werden zusammen eingerahmt und schreiben ein Sheet, je eine Zeile: Die Seiten eines Rings stehen in einer Linie. Eine anders eingerichtete Kamera schreibt ihre eigenen Sheets, und eine Sprites-Node nimmt die Zeilen der Gruppe, die gerade geschrieben wird. Eine Sprites-Node, die Kameras aus zwei Gruppen nennt – South, top –, sammelt sie stattdessen in einer Datei, geschrieben, sobald jede Kamera gerendert hat, neben dem Sheet des Projekts unter dem Namen ihrer Sheet-Node (out/hero_both.png); Zeilen werden nach ihrer Kamera benannt (walk_South, walk_top). Ein Sheet hat eine Framegröße und eine Palette, also werden Kameras, die in verschiedenen Größen einrahmen, abgelehnt statt zusammengequetscht: Gib ihnen dieselbe Größe.
Ein Icon-Raster sind drei Nodes: eine Sprites-Node der Action idle von der Kamera South, ein Anordnen als Streifen und ein Sheet, dessen PNG nach out/icons.png geht. Ein Kontaktbogen ist dasselbe mit Padding. Das sind keine Features; das sind Graphen.
Aus einem Skript:
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
Der im Style portrait gezeichnete Gang wird eigens gerahmt, also schreibt er seine eigenen Sheets neben diese: out/game_portrait_8fps.png, und den Funken, der keinen eigenen Style hat, noch einmal in out/sparks_South_portrait_8fps.png.
Die Zahlen sind die, die die Anleitung auf dieser Seite ergibt; pxr graph list gibt die eines Projekts aus. --alone hält das Icon-Raster aus der Kette des Haupt-Sheets heraus: Eine idle-Liste, die ebenfalls hineingeführt würde, wären dieselben Frames zweimal, was die Namensvorlage ablehnt.
pxr graph add setzt eine Node verbunden in die Kette: einen Frame-Bereich oder ein Halten vor das Anordnen, eine Sheet-Node danach und eine zweite Sprites-Node über ein Zusammenführen neben die erste. --set auf einem Sheet nimmt path, names und recipe; formats fügt seine Datei-Nodes hinzu und entfernt sie — das PNG immer darunter, wie in der eigenen Liste eines Exports; entferne seine Node, um keines zu schreiben —, und die Wörter der Einstellungen, die seine Datei-Nodes tragen, erstellen und setzen diese Nodes: shadow=drop, variants=hit-flash,hue:120, anim_scale=4, paper_doll=yes, pieces=helmet:Helmet,Visor, parallax=3, haze=none. Die eigenen Einstellungen einer Datei-Node werden über ihre Nummer gesetzt: --node 5 --set fps=60.
Linien neben Farben
Ein Sheet kann mehr als eine Ebene derselben Listen tragen. Verbinde die Sprites-Node zweimal — einmal direkt, einmal über eine Ebene von lines — und füge sie entweder mit Zusammenführen vor einem Anordnen zusammen, oder ordne jede an und Stapeln setzt die beiden Sheets nebeneinander. Das JSON nennt die Linienzeilen walk_South_lines, und ihre IDs unterscheiden sich von denen der Farb-Frames durch ihre Ebene, denn das ist, was sie sind. Eine Vorlage, die {layer} nicht nennt, hängt es trotzdem an die Namen dieser Frames an (hero_walk_South_00_lines.png), damit zwei Frames nie auf einem Namen landen; die eigenen Frames des Sprites behalten ihre. Eine Sprites-Node eines Teile-Sets macht dasselbe mit {set} (hero_attack_South_00_bare.png), und das Set ist Teil der IDs dieser Frames. Oder lege die beiden mit einem Überlagern exakt übereinander, so wie die Engine sie zeichnen wird.
Textdateien aus einer Vorlage
Eine Engine, von der Pixor nie gehört hat, braucht einen Deskriptor, und das ist eine Textdatei über dieselben Frame-Metadaten, die das JSON trägt. Eine Textdatei-Node schreibt eine aus einer Vorlage:
{sheet} {width}x{height}
{#frames}{name} {x} {y} {w} {h} {duration}{sep}
{/frames}
{#frames} ... {/frames} schreibt seinen Inhalt einmal pro Frame. Außerhalb davon gehören die Wörter dem Sheet: {project}, {object}, {sheet} (der Dateiname des Bildes), {width}, {height}, {cell_w}, {cell_h}, {pivot_x}, {pivot_y}, {frames}. Innerhalb davon einem Frame: {name}, {id}, {action}, {side}, {row}, {index}, {n} (die Nummer des Frames auf dem Sheet), {layer}, {x}, {y}, {w}, {h}, {source_x}, {source_y}, {duration} (Millisekunden), {pivot_x} und {pivot_y} (die eigenen des Clips, wenn ein Tag ihm welche gegeben hat), {loop} (true oder false), {root_x}, {root_y}, {root_dx} und {root_dy} (Root Motion, wie das JSON sie angibt), {boxes} und {sockets} (als JSON) und {sep}, ein Komma außer nach dem letzten Frame — genug für eine JSON-Liste. {index:3} füllt eine Zahl mit Nullen auf; {{ und }} schreiben eine geschweifte Klammer.
Eine Vorlage kann stattdessen in einer eigenen Datei neben dem Projekt liegen: Gib der Node eine Vorlagendatei (--set file=frames.tpl per Skript), und sie wird bei jedem Schreiben der Ausgabe gelesen; so bearbeitet ein Studio seinen Deskriptor dort, wo es seine anderen Dateien aufbewahrt.
Es gibt keine Bedingungen, keine Rechenarten und keine Includes. Es ist eine Art, eine Datei zu benennen, keine Sprache. Ein Wort, das Pixor nicht kennt, wird beim Eingeben der Vorlage abgelehnt, nicht in eine Datei geschrieben.
Ein Layout als eine Gruppe
Ein Icon-Raster, ein Kontaktbogen, die eigene Art eines Studios, eine Figur anzuordnen: Kit speichern… in der Leiste speichert ohne gewählte Gruppe den Asset-Graphen als Kit (Den Asset-Graphen als Kit speichern): sein Layout, was sein Sheet speist, als eine Gruppe, die Sprite-Listen aufnimmt (jede Sprites-Node wird zu einem Eingang) und das Sheet ausgibt. Das Sheet und die daran hängenden Dateien bleiben die des Projekts. + › Kit verwenden… (Kit als Gruppe hinzufügen) setzt es als eine Gruppe in den Asset-Graphen eines anderen Projekts, um es dort mit einem Sheet zu verbinden oder anstelle eines Anordnen zu setzen. Doppelklicke darauf oder drücke den Pfeil in seinem Titel, um es an Ort und Stelle zu öffnen; der Pfeil klappt es wieder zu. Per Skript:
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
Was es nicht tut
- Binärformate bleiben Code. PNG,
.aseprite, GIF, APNG, GodotSpriteFrames, die Licht-Kits und.p8sind Sheet- und Datei-Nodes; eine Vorlage schreibt Text. - Keine Plugin-Binärdateien und keine Skript-Nodes, hier wie in den anderen Graphen.
Was diese Seite beschreibt, gibt es in der Vollversion; die kostenlose Browser-Demo beschränkt sich auf den Standard-Look und das PNG-Sheet.
Im Browser testen Pixor holen
