Il grafo di Asset
Il grafo di Asset è dove si progetta un'esportazione; la finestra di esportazione è dove la si esegue. La fase Asset trasforma gli elenchi di sprite in file, e il modo in cui lo fa è un grafo: gli elenchi di sprite entrano, vengono disposti su uno sheet ed escono come file. Sono i tre tipi di collegamento, e non si possono confondere — un elenco non si può collegare a uno Sheet senza essere prima disposto, e uno sheet non può ricevere tag.
I suoi ingressi sono nodi Sprite (e nodi File immagine, per immagini dall’esterno), ognuno dei quali porta elenchi di sprite: un’azione vista da una camera, disegnata con uno Stile, con un set di parti, tagliata in fotogrammi, con ogni livello. Un nodo Sprite li nomina tutti, in modo fisso: le scelte dell’intestazione della finestra non sono le sue, così ciò che un asset scrive non dipende mai da ciò che capita di essere mostrato. Le sue uscite sono un nodo per file. Un nodo Sheet è uno sprite sheet in memoria: mostra lo sheet sulla sua faccia e non scrive nulla. Ogni file è un nodo File collegato da esso: Immagine PNG per lo sheet stesso, poi il suo JSON, il suo .aseprite, i suoi SpriteFrames di Godot, la sua normal map. Per esportare uno sprite sheet, collega Sheet → PNG. Un grafo può averne di ciascuno quanti sono i file che il progetto deve scrivere.
Tutto ciò che si può dire a un’esportazione è su un nodo, tranne la cartella in cui va: quella spetta alla finestra Esporta, che elenca ogni file che il grafo vi scriverà, per nome e tipo, prima che tu prema Esporta: il modo più rapido per vedere cosa fa ai file una modifica al grafo. Come si chiamano i fotogrammi di uno sheet sta sul suo nodo immagine PNG (e nell’Ispettore con il suo Sheet), la sua disposizione sul Disponi che lo alimenta, e ogni altro file che scrive (con le impostazioni proprie di quel file: la scala di una GIF, la frequenza di un video, quale ombra, quali varianti di palette) è un nodo File collegato a esso. Un progetto che non ricollega mai il grafo non ne salva nessuno: è un solo sheet con ogni elenco di sprite.
Un’immagine può mostrare qualsiasi livello. Sotto l’immagine di uno Sheet, qui, Livello sceglie il livello che disegna (finché non glielo si dice, quello disegnato dal Livello della Vista 2D): lo sprite, le sue linee, i colori piatti, le normali, la profondità, l’emissione, un’uscita extra di uno Stile, oppure Ogni livello insieme: quelli di un fotogramma affiancati, quelli di un elenco una riga ciascuno.
Questo è il grafo da cui parti, la pipeline di asset Main:
Sprites (every action except Static) → Arrange → Sheet (sheet) → PNG image
Le scelte dell’intestazione della finestra
Azione, Stile e Asset sono pipeline indipendenti, ognuna con un grafo a sé. L’estremità destra della riga delle schede delle aree di lavoro contiene quattro selettori (Camera, Azione, Stile, Asset) dopo Riproduci/Pausa: una scelta per ciascuno, valida in ogni fase.
| Gradino | Disegna |
|---|---|
| Azione | l’azione scelta, vista dalla camera scelta |
| Stile | l’azione scelta, vista dalla camera scelta, disegnata dallo Stile scelto |
| Asset | ciò che nominano i nodi Sprite del suo grafo, non le scelte dell’intestazione |
L’elenco Stili (fase Stile) e l’elenco Asset (fase Asset) sono le stesse scelte dei selettori Stile e Asset dell’intestazione: un clic in uno dei due mostra la stessa cosa. La finestra Esporta parte con la pipeline di asset scelta nel selettore Asset dell’intestazione, e scrive solo quella; i suoi file prendono gli stessi nomi di quando si scrive ogni pipeline di asset (pxr render --pipeline all le scrive tutte).
Da dove vengono gli elenchi di sprite
Gli elenchi di sprite si creano qui, dai nodi Sprite, e solo qui: quali azioni vanno negli sheet è ciò che prendono i nodi Sprite, nient’altro. Un nodo Sprite nomina una camera, un’azione, uno Stile e un set di parti, e contiene il taglio: come il movimento dell’azione diventa fotogrammi.
La sua Azione è una tra:
- Tutti tranne Statica (
every-one-except-static, ciò che prendono un nuovo nodo Sprite, la pipeline di Asset con cui parte un progetto e un nuovo progetto): ogni azione dell’elenco delle Azioni tranne Statica, la posa di riposo ferma; comunque Statica quando il progetto non ha altre azioni (un modello fermo), così anche una cassa ha il suo sprite. - Ognuno (vuoto, o
*): ogni azione, Statica compresa. - Un’azione per nome, Statica compresa: solo quell’azione, o più di una (
walk, attackdapxr graph set). Una clip del modello viene disegnata quando un nodo Sprite la nomina, che sia o no una delle azioni del progetto: se nominata, i suoi fotogrammi ci sono sempre, nell’immagine del nodo, in ciò che alimenta e nell’esportazione.
Un nome che non corrisponde a nulla (un'azione eliminata o rinominata altrove) viene segnalato sul nodo, in parole semplici: Nessun fotogramma di Sway visto da South: scegli sul nodo Sprites un'azione e una camera che il progetto ha.
Il taglio è sulla sua faccia e nell’Ispettore:
- Fotogrammi/s (
fps): un fotogramma ogni tot secondi, 12 al secondo finché non indicato. - Fotogrammi tenuti (
smart): tanti fotogrammi intelligenti, scelti come farebbe un animatore: le pose in cui il movimento cambia direzione, di più dove è veloce, ognuna tenuta fino alla successiva. 0 è disattivato. Fotogrammi intelligenti sulla sua faccia li attiva, Usa fotogrammi/s torna a un passo regolare. - Fotogrammi scelti (
picked): istanti in secondi, scelti a mano. Con il nodo Sprites selezionato, la Timeline dietro il grafo di Asset mostra i suoi fotogrammi: fai clic sulla striscia delle chiavi per aggiungerne o toglierne uno, o trascina una chiave lungo di essa (un passo di annullamento ciascuno). La faccia del nodo dice N fotogrammi scelti sulla timeline.
I fotogrammi scelti vincono quando ce ne sono, poi i fotogrammi mantenuti, poi i fotogrammi al secondo. Un nodo Sprite aggiunto a un grafo inizia tagliato come il primo del grafo. Un’azione fatta di nodi o chiavi viene tagliata ai suoi fotogrammi. Tenuta (ms) accanto al contatore dei fotogrammi della Timeline imposta la tenuta del fotogramma mostrato (vedi tenere un fotogramma più a lungo): quella dell’azione, così ogni nodo Sprite che prende la clip la mantiene. La fase Azione non viene cambiata da nulla di tutto questo: riproduce l’intero movimento, e un fotogramma dello sprite cade sul tempo in cui è stato tagliato.
Tra il nodo Sprites e il Disponi vanno i nodi che tagliano un elenco:
| Nodo | Cosa fa |
|---|---|
| Intervallo di fotogrammi | Solo i fotogrammi da from a to di ciò che entra, contati da 0: la carica di un attacco come elenco a sé, un fotogramma di un idle come icona, un elenco su due sheet. Un intervallo mantiene ciò che ogni fotogramma mostrava: il suo tempo nella clip, il suo set di parti, il suo spostamento della radice. Un intervallo di un intervallo conta in ciò che è entrato; una parte di un loop non va più in loop; un intervallo oltre la fine mantiene l’ultimo fotogramma. |
| Tenuta | Ogni fotogramma tenuto tante volte più a lungo: 2 riproduce l’elenco a metà velocità. |
Sprites (South, attack, Pixel Art, smart 6) → Frame range (2 to 5) → Hold (×2) → Arrange → Sheet → PNG image
Scegliere un nodo Sprite, Intervallo di fotogrammi o Tenuta fa riprodurre alla Vista 2D l’elenco che produce, tagliato, suddiviso e a livelli come verrà scritto. Nessuno di questi nodi costa un render: decidono quali fotogrammi vanno dove prima che esista un pixel.
Per riusare una catena, scegli Sprites → Intervallo di fotogrammi → Tenuta e raggruppali (Ctrl+G), poi Salva kit… conserva il gruppo come kit di nodi sotto I miei nodi; oppure salva l'intera pipeline di Asset come kit (vedi Pipeline di asset).
I render, e come si chiamano i loro file
Un render è un'inquadratura, uno Stile e il modo in cui viene tagliata ogni clip. I nodi Sprites condividono un render finché sono d'accordo: lo stesso Stile, inquadrati insieme, e nessuna clip tagliata in due modi. Così una camminata a 8 fotogrammi al secondo e un attacco scelto a mano sono un solo render e un solo sheet. Un secondo nodo che taglia la camminata in fotogrammi intelligenti, o la disegna con un altro Stile, è un render a sé.
Il primo render scrive i suoi file come li nomina il grafo. Un altro viene scritto accanto con le parole che lo distinguono dal primo: la sua camera, il nome del suo Stile, poi il taglio di ogni clip che taglia diversamente: 8fps (o 12_5fps), smart6, picked4 (quattro fotogrammi scelti a mano). Quindi out/hero.png, poi out/hero_smart6.png e out/hero_Pixel_Art_2_8fps.png, ognuno sulla palette del suo Stile. pxr names elenca i file di ogni render, con i fotogrammi che tiene un Intervallo di fotogrammi, e rifiuta due render che scriverebbero un solo file (due tagli diversi scelti a mano di quattro fotogrammi della stessa clip) prima che qualcosa venga renderizzato: would be written twice.
Da uno script:
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
L’Intervallo di fotogrammi e la Tenuta vanno tra il nodo Sprite dell’attacco e il Fondi, così tagliano solo l’attacco. Aggiunti senza --alone, andrebbero prima del Disponi, dopo il Fondi, e taglierebbero ogni elenco che il Fondi unisce.
pxr render --fps 8, --smart-frames 6 e --keys 0,0.25,0.5 impostano in un colpo il taglio di ogni nodo Sprites. Uno schema eseguito con pxr run game.pixorblueprint --set hold.times=4 raggiunge il nodo Tenuta di ogni pipeline di Asset, --set icons/hold.times=4 solo quello della pipeline icons.
Il pannello
Una volta salvato un grafo, la Vista 2D sopra di esso mostra ciò che scrive l’uscita scelta (le sue riprese, i blocchi, le posizioni, le pile e le sovrapposizioni), disegnato dallo stesso codice che scrive il file; prima di allora, è una riga per azione e lato, che puoi trascinare per riordinare.
Grafo di Asset è un pannello della fase Asset, sotto la Vista 2D, sulla stessa tela del grafo di Scena: riquadri, collegamenti, impostazioni sulla faccia di ogni nodo, un più per aggiungere un nodo nella catena collegata, un meno per eliminarne uno, Inquadra per vedere tutto, Riordina per ridisporlo, Nota per aggiungervi una nota, Gruppo per fare dei nodi scelti un gruppo, e Salva kit… per conservare il gruppo scelto, o se non ne è scelto nessuno l’intero grafo, come kit (Salva il grafo di Asset come kit): la barra che ogni grafo ha, con i tasti che ogni grafo ha (Lavorarci). La sua libreria di nodi sulla sinistra elenca Ingressi e Uscite, le Pipeline del progetto e Le mie pipeline, poi Tra e i tuoi kit sotto I miei nodi. Clic destro sulla tela › Torna a un solo sheet lo riporta a un solo sheet con i file che aveva. Icone scrive icone d’inventario. La riga in basso dice cosa scrive il grafo. File generati, il primo sulla barra, apre la cartella generata nel tuo file manager.
Ogni nodo file ha Apri: apre il file di quel nodo nell’applicazione con cui il tuo sistema apre quel tipo di file (lo sheet in un editor di immagini, il .aseprite in Aseprite, il video in un lettore, l’archivio in un gestore di archivi; il suo suggerimento dice quale). Un file non ancora generato, o non aggiornato, viene generato prima, con un indicatore di caricamento su Apri nel frattempo.
Ogni impostazione di un nodo asset è una proprietà (vedi nodi): una riga con una porta alla sua sinistra, impostata sul nodo o collegata da un valore. Canc elimina il nodo scelto, come fa il meno; l’ultimo nodo che scrive resta.
Ogni nodo tra gli elenchi e i file mostra ciò che passa avanti, disposto su uno sheet: un nodo Livello il suo livello, un Intervallo di fotogrammi i suoi fotogrammi, uno Specchia il suo riflesso, un Disponi il suo sheet. Un’immagine mostra tutto ciò che nominano i suoi nodi Sprite, qualunque cosa mostri l’intestazione della finestra: ogni camera, azione e Stile, da ogni render in cui sono disegnati. Camere inquadrate separatamente (un’altra vista, inclinazione o dimensione), un altro Stile o una clip tagliata in un altro modo sono render a sé, scritti in sheet a sé; un’immagine alimentata da più di essi dispone un blocco per ogni sheet, sotto il nome del file in cui viene scritto (hero.png, poi hero_top.png), con le righe come quelle di quello sheet. I render che la Vista 2D non mostra vengono disegnati dietro di essa, uno dopo l’altro, e conservati finché il progetto non cambia. Un nodo non blocca mai l’immagine di un altro: ognuno è disposto solo da ciò che lo alimenta, e un nodo che non può esserlo (un file immagine non ancora scelto, un Fondi senza nulla collegato) dice perché in rosso dove sarebbe la sua immagine, e così i nodi che alimenta, mentre gli altri mantengono la loro. Le immagini sono disposte da ogni elenco, disegnato per intero: mentre un Intervallo di fotogrammi o una Tenuta scelti fanno riprodurre alla Vista 2D il loro unico elenco, esse mantengono gli elenchi disegnati per intero l’ultima volta, e un nodo aggiunto nel frattempo prende la sua immagine da essi. Quando qualcosa da cui sono disegnate cambia nel frattempo (una parte nascosta nella Struttura, un materiale, una lampada), vengono ridisegnate dietro la Vista 2D, che continua a riprodurre l’intervallo. Ogni nodo file mostra il suo file prima che venga esportato, creato dallo stesso scrittore usato da un’esportazione: un’immagine di esso sul nodo, e il tutto nella Vista 2D quando il nodo è scelto: un PNG o una mappa come immagine, una GIF, un APNG o un video in riproduzione, un JSON, un file Godot o un file di testo come testo, e uno ZIP come elenco di ciò che contiene. Un nodo che scrive più file (una GIF per clip, un livello per file) ha un elenco File sopra la vista.
File veloci, e Genera
Ciò che è rapido da creare viene mostrato mentre il grafo cambia; ciò che è lento aspetta il Genera del suo nodo (D51). Rapidi: tutto ciò che sta tra gli elenchi e i file, lo Sheet, e l'immagine PNG, JSON, SpriteFrames di Godot, Palette, File di testo, Mappa di emissione, Livello delle ombre e Livelli di linee e tinte piatte. Lenti: GIF, APNG e Video per clip, il file Aseprite, Normal map e mappe di profondità, Varianti di palette, Light kit, Cartuccia PICO-8, Rapporto, Archivio ZIP, File di animazione e Icone — ciò che codifica di nuovo ogni fotogramma, o renderizza. (I livelli paper doll e di parallasse sono render a sé: li crea la finestra di esportazione.)
Un nodo lento mostra Genera al posto del suo file. Premendolo, il file viene creato in disparte — il pulsante diventa un indicatore di caricamento, e tu continui a lavorare — poi il nodo mostra la sua immagine, la Vista 2D il file, e il pulsante dice Rigenera. Cambia qualsiasi cosa lo alimenti, e il nodo conserva ciò che ha creato ma dice Non aggiornato invece di ricrearlo: premi Rigenera, o Apri, che prima genera.
File generati
Ciò che creano Genera e Apri sono file veri, in una cartella temporanea del progetto aperto (sotto la cartella temporanea del sistema, chiamata pixor-generated- più il progetto), una cartella per pipeline di asset e una per nodo. File generati sulla barra la apre. Si pulisce da sola: eliminare un nodo ne elimina i file, eliminare una pipeline di asset la sua cartella, e chiudere il progetto o uscire da Pixor l’intera cartella; una cartella lasciata da un crash viene rimossa al successivo avvio di Pixor. Non sono mai ciò che scrive un’esportazione: la finestra Esporta scrive ogni file da zero.
Anche le impostazioni del nodo scelto sono nell’Ispettore, e senza nulla di scelto, quelle dello Sheet del grafo. Lì, sotto le impostazioni di uno Sheet, ogni file che può scrivere è un interruttore: spuntare JSON o Video per clip aggiunge quel nodo File, collegato dallo sheet, e togliere la spunta lo rimuove. Così un’esportazione si imposta in pochi clic senza toccare un collegamento, ed è comunque un grafo: ogni interruttore è un nodo che puoi vedere, con le sue impostazioni.
I nodi
Nodi N x N. Livello, Intervallo di fotogrammi, Tenuta, Specchia, Tag, Disponi e Posa fanno la stessa cosa a quanti elenchi sono collegati a essi, e restituiscono ciascuno su un’uscita a sé, di fronte al suo ingresso: un solo nodo Livello prende le normali di quattro elenchi di sprite e passa avanti quattro elenchi. C’è sempre un ingresso libero per il successivo. Fondi fa il contrario: un numero qualsiasi di elenchi in ingresso, uno in uscita.
| Nodo | Riprese | Dà | Cosa fa |
|---|---|---|---|
| Sprite | — | fotogrammi | Ingresso. Elenchi di sprite, fissati qui qualunque cosa mostri l’intestazione della finestra: con più scene, la scena scelta (o tutte); la camera scelta (o tutte), dove una camera è un lato; l’azione scelta (Tutti tranne Statica, Ognuno, o una per nome, Statica compresa), disegnata con lo Stile scelto (il primo del progetto per ciascuno, finché non indicato), e tagliata come dicono i suoi Fotogrammi/s, Fotogrammi tenuti o Fotogrammi scelti (vedi da dove vengono gli elenchi di sprite). Camera e azione accettano anche, da pxr graph set, un elenco separato da virgole (South, East, North) o l’inizio di un nome e * per un anello (turret*). Un set di parti del progetto renderizza di nuovo ogni clip con quel set attivo su ogni fotogramma (equipaggiamento, stati di danno). Ogni livello arriva con l’elenco; un nodo Livello ne sceglie uno, e senza di esso lo sheet è dello sprite finito. |
| File immagine | — | fotogrammi | Ingresso: un’immagine dall’esterno, come elenco di sprite a sé: un PNG (un fotogramma, o una striscia o griglia tagliata in fotogrammi di Larghezza del fotogramma per Altezza del fotogramma, ognuno tenuto Ogni fotogramma) oppure una GIF, con i suoi fotogrammi, i loro ritardi e se va in ciclo. Chiamato è il nome della sua riga. L’immagine prende la palette dello sheet (ogni pixel il suo colore più vicino; ciò che è trasparente per più della metà è vuoto) ed è centrata in una cella; un fotogramma più grande di una cella viene rifiutato, indicando entrambe le dimensioni. Va sugli sheet a cui è collegato il suo nodo e su nessun altro. |
| Fondi | fotogrammi, … | fotogrammi | Ogni elenco collegato, come uno solo: molti elenchi di sprite su uno sheet. |
| Livello | fotogrammi × N | fotogrammi × N | Un livello di ogni elenco: final, lines o flat, o una delle mappe con cui un gioco illumina lo sprite (normal, depth, emission), il che rende lo sheet su cui finisce un’immagine di colori invece che di indici di palette; oppure shadow, l’ombra che proietta ogni fotogramma, in nero (quella che chiede l’Ombra del progetto, altrimenti un’ombra di contatto), che una Sovrapposizione mette sotto lo sprite; oppure il nome di una delle uscite extra del grafo di Stile, le cui righe prendono allora il suo nome (idle_South_rim). Anche le immagini proprie di un render sono livelli: con oggetti di scena o pezzi, la base di un paper doll e ogni pezzo con il suo nome (idle_South_helmet); con livelli di parallasse, da layer0 (il più lontano) all’ultimo. Ognuno viene renderizzato solo quando un Livello lo nomina, da pxr render, che è ciò che esegue la finestra Esporta dell’app. Separa i livelli di un elenco con un nodo Livello per livello, ognuno verso il proprio Sheet; combinali con un Fondi, una Pila o una Sovrapposizione. |
| Intervallo di fotogrammi | fotogrammi × N | fotogrammi × N | I fotogrammi da from a to di ogni elenco, contati da 0: from=3 to=3 per un’immagine ferma o un’icona (uno nuovo è from=0 to=0, il primo fotogramma), from=2 to=5 per pochi. Separa un elenco su più sheet con un Intervallo di fotogrammi per parte. |
| Tenuta | fotogrammi × N | fotogrammi × N | Ogni fotogramma di ciascun elenco tenuto volte più a lungo. |
| Specchia | fotogrammi × N | fotogrammi × N | Ogni elenco specchiato da sinistra a destra, al posto di un’altra camera: un nodo Sprites di East specchiato come West diventa walk_West, ricavato da walk_East — pixel, normali, hitbox e root motion specchiati. Un modello simmetrico non ha bisogno di renderizzare l’altro lato. |
| Tag | fotogrammi × N | fotogrammi × N | Se le righe vanno in ciclo (Mantieni, Sì o No) e un pivot tutto loro (x,y in pixel della cella) per una clip che sta in piedi in modo diverso. Una clip che non va in ciclo è un tag che si riproduce una volta nel JSON e nel .aseprite; il pivot è su ogni fotogramma del JSON e su una chiave della slice del pivot. |
| Disponi | fotogrammi × N | sheet × N | Ogni elenco su uno sheet: griglia o striscia, spaziatura, estrusione, potenza di due, ritaglio, fotogrammi ripetuti salvati una volta sola, una larghezza massima oltre cui le righe vanno a capo, un’altezza massima oltre cui lo sheet è diviso in pagine (clip intere per pagina, ognuna con il proprio set di file), e fotogrammi per riga, che fa scorrere ogni clip dopo l’ultima come in un provino a contatto. |
| Posa | sheet × N | sheet × N | Ogni sheet spostato in un punto dell'immagine. |
| Pila | sheet, sheet | sheet | Due sheet come uno solo, il secondo sotto o accanto al primo, con uno spazio. |
| Sovrapposizione | in basso, in alto | sheet | Uno sheet posato esattamente sopra un altro, come il motore impila i livelli: i pixel vuoti di quello sopra mostrano quello sotto. Ogni livello si può disattivare per vedere l’altro da solo. I due devono allinearsi fotogramma per fotogramma (gli stessi fotogrammi negli stessi posti), altrimenti l’esportazione dice quale fotogramma non lo fa. |
| Sheet | sheet | file | Uno sprite sheet in memoria. Non scrive nulla: i suoi file sono nodi File collegati a partire da esso. Chiamato è il suo nome. |
| File | sheet | file | Uscita: un file su disco, scritto dallo Sheet da cui parte il collegamento, con le sue impostazioni sulla faccia del nodo, Apri per aprire il suo file e Genera quando è lento da creare. Immagine PNG (lo sheet stesso, e come si chiamano i suoi file: File in, il percorso in cui scrive il PNG, il cui nome viene ripreso dagli altri, sotto la cartella data alla finestra Esporta; Nomi dei file, il modello con cui vengono nominati i suoi fotogrammi, con sotto il primo nome che genera; Ricetta nei file, se i file riportano come sono stati creati; File propri dà allo sheet un percorso, dei nomi e una ricetta propri, e se è disattivato i suoi file vanno dove esporta il progetto — l'Ispettore mostra queste impostazioni anche con lo Sheet), JSON, File Aseprite, SpriteFrames di Godot, Normal map, Mappa di profondità, Mappa di emissione, Livelli di linee e tinte piatte, Palette, Light kit, Cartuccia PICO-8, Rapporto; GIF per clip e APNG per clip (Scala); Video per clip (Scala, Fotogrammi al secondo, Sfondo); Livello delle ombre (di contatto o proiettata); Varianti di palette (il loro elenco); Livelli paper doll (Pezzi); Livelli di parallasse (Livelli, Foschia sui livelli lontani). Eliminare uno Sheet elimina i suoi nodi File. |
| File di testo | sheet | file | Uscita: un file di testo da un modello applicato ai fotogrammi (sotto). |
| File di animazione | fotogrammi | file | Uscita: un'animazione per ogni elenco di sprite collegato, senza sheet in mezzo: una GIF, un APNG o un video non compresso (Ogni elenco come), Scala volte più grande, un video a Fotogrammi al secondo su Sfondo. Salva in è l'inizio del nome di ogni file: out/spin scrive out/spin_walk_South.gif. |
| Icone | — | file | Uscita: icone d'inventario del modello, dall'angolazione ¾ sotto la luce da studio, contornate nel colore della Rarità (o Dal nome del file), Inquadrato o no, in ciascuna delle Dimensioni: per ogni dimensione un PNG per icona, un atlante e un indice JSON, nella cartella Salva in. Un'icona è un render a sé, quindi non riceve nulla; pxr le crea dopo gli sheet, nella cartella dell'esportazione. Vedi icone d'inventario. |
| Archivio ZIP | file, … | file | Uscita: uno ZIP dei file dei nodi file collegati (A è dove va) — uno Sheet collegato equivale a tutto ciò che quello sheet scrive — oppure, senza collegamenti, di ogni file scritto dall’esportazione. I livelli paper doll e di parallasse entrano con il resto. Gli stessi file danno lo stesso archivio, byte per byte. È ciò che si consegna a qualcun altro o si carica su uno store. |
Un piano, non un render. Il grafo decide quali fotogrammi vanno dove prima che esista un pixel, quindi la fase Asset funziona anche con la fase Stile vuota, e pxr names stampa ogni nome e id che il grafo scriverà, senza renderizzare.
I fotogrammi mantengono la loro identità. Ridisporre uno sheet sposta rettangoli e lascia stare l’id di ogni fotogramma (vedi Come si chiamano i fotogrammi e cosa sono).
Pipeline di asset
Un progetto ha tutte le pipeline di Asset che vuole, ognuna un grafo di asset a sé con il suo nome (lo sheet del personaggio, un set di icone, le immagini di una pagina dello store) e la finestra Esporta scrive quella che scegli (pxr render --pipeline all le scrive tutte). L’elenco Asset sulla sinistra della fase Asset e il selettore Asset dell’intestazione scelgono quella sulla tela. Nuova pipeline di Asset sotto l’elenco crea una copia di quella mostrata, con il suo nome (Main 2), e il menu del clic destro su una riga la rinomina, la Duplica, la elimina (Elimina NOME…, che chiede prima: anche la prima, purché ne resti un’altra) e:
- Salva kit… (Salva la pipeline di Asset come kit) scrive la pipeline come kit. Salvato nella libreria delle pipeline (dove si apre la finestra), compare nella libreria dei nodi di ogni progetto sotto Le mie pipeline.
- Usa kit… (Usa un kit di pipeline di Asset), o un clic su uno sotto Le mie pipeline, rende propria di questo progetto una pipeline salvata da un altro progetto. I suoi nomi — quello della pipeline, dei suoi sheet, dei suoi file — vengono resi tali che nulla qui li abbia già.
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
Immagini dall’esterno
Un nodo File immagine mette su uno sheet di Pixor ciò che è stato disegnato altrove: un logo su uno sheet del titolo, un effetto dipinto a mano, fotogrammi da un altro strumento. Aggiungilo, Scegli… un PNG o una GIF, e si unisce agli elenchi di sprite tramite un Fondi; collegalo a uno sheet a sé per tenerlo separato.
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 accetta il numero di un nodo da pxr graph list, il suo nome (logo) o il suo tipo (frame-range) quando il grafo ne ha uno solo di quel tipo.
Un'immagine prende la palette dello sheet: ogni pixel il più vicino dei suoi colori. Spunta Colori propri e mantiene invece i suoi: vengono aggiunti in fondo alla palette dello sheet (prima i più usati, quanti ce ne stanno nella palette), così ogni file dello sheet — il PNG, il .aseprite, le GIF, i file di palette — li contiene, e una variante di palette li lascia come sono. I fotogrammi propri dello sheet non cambiano.
Un'immagine più grande della cella ingrandisce le celle di ogni file su cui finisce: gli altri fotogrammi vengono centrati nelle celle più grandi, e il loro pivot, le hitbox e i punti di aggancio si spostano con loro.
Più file da un solo render
Un grafo può avere più nodi Sheet, ognuno con un PNG collegato: un solo render scrive allora uno sheet del personaggio, un set di icone e un'immagine promozionale. Uno Sheet senza PNG non scrive alcuna immagine — solo i file collegati a esso, ed è così che si scrive il solo JSON di uno sheet. Un secondo Sheet prende ciò che prende il primo finché non viene collegato a elenchi propri. Ognuno ha il proprio percorso, modello di nome e ricetta, o prende quelli del progetto; i file accanto — e le loro ombre, varianti e scale — sono i suoi nodi File. Quando due prendono quelli del progetto, il primo scrive lo sheet del progetto e il successivo scrive accanto con il proprio nome (out/hero_icons.png per uno chiamato icons), così nulla viene scritto due volte; due che indicano lo stesso percorso proprio vengono rifiutati con entrambi i nomi. Uno Sheet aggiunto da uno script riceve un nome che nessun'altra uscita ha (sheet 2), come nell'app, e pxr names elenca i file con i nomi che il render dà loro.
Le camere con la stessa vista, inclinazione, dimensione e look vengono inquadrate insieme e scrivono un solo sheet, una riga ciascuna: i lati di un anello si allineano. Una camera impostata diversamente scrive i propri sheet, e un nodo Sprite prende le righe del gruppo in scrittura. Un nodo Sprite che nomina camere di due gruppi (South, top) le raccoglie invece in un solo file, scritto quando ogni camera ha renderizzato, accanto allo sheet del progetto con il nome del suo nodo Sheet (out/hero_both.png); le righe prendono il nome della loro camera (walk_South, walk_top). Uno sheet ha una sola dimensione di fotogramma e una sola palette, quindi le camere che inquadrano a dimensioni diverse vengono rifiutate invece di essere schiacciate insieme: dai loro la stessa dimensione.
Una griglia di icone sono tre nodi: un nodo Sprites dell'azione idle dalla camera South, un Disponi a striscia, e uno Sheet il cui PNG va in out/icons.png. Un provino è la stessa cosa con un margine. Non sono funzioni; sono grafi.
Da uno script:
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
La camminata disegnata nello Stile portrait viene inquadrata a parte, quindi scrive i propri sheet accanto a questi: out/game_portrait_8fps.png, e la scintilla, che non ha uno Stile suo, di nuovo in out/sparks_South_portrait_8fps.png.
I numeri sono quelli della procedura di questa pagina; pxr graph list stampa quelli di un progetto. --alone tiene la griglia di icone fuori dalla catena dello sheet principale: un elenco idle unito anche lì darebbe gli stessi fotogrammi due volte, cosa che il modello del nome rifiuta.
pxr graph add inserisce un nodo nella catena, già collegato: un Intervallo di fotogrammi o una Tenuta prima del Disponi, un nodo sheet dopo, e un secondo nodo Sprites accanto al primo tramite un Fondi. --set su uno Sheet accetta path, names e recipe; formats aggiunge e rimuove i suoi nodi File — sempre con il PNG tra loro, come nell'elenco di un'esportazione; elimina il suo nodo per non scriverne nessuno — e le parole delle impostazioni contenute nei suoi nodi File creano e impostano quei nodi: shadow=drop, variants=hit-flash,hue:120, anim_scale=4, paper_doll=yes, pieces=helmet:Helmet,Visor, parallax=3, haze=none. Le impostazioni proprie di un nodo File si impostano su di esso tramite il suo numero: --node 5 --set fps=60.
Linee accanto ai colori
Uno sheet può contenere più di un livello degli stessi elenchi. Collega il nodo Sprites due volte — una direttamente, una tramite un Livello di lines — e uniscili con Fondi prima di un unico Disponi, oppure disponi ciascuno e metti i due sheet in Pila uno accanto all'altro. Il JSON chiama le righe delle linee walk_South_lines, e i loro id differiscono da quelli dei fotogrammi a colori per il livello, che è ciò che sono. Un modello che non dice {layer} lo aggiunge comunque ai nomi di quei fotogrammi (hero_walk_South_00_lines.png), così due fotogrammi non finiscono mai su un solo nome; i fotogrammi propri dello sprite mantengono i loro. Un nodo Sprites di un set di parti fa lo stesso con {set} (hero_attack_South_00_bare.png), e il set fa parte degli id di quei fotogrammi. Oppure posa i due esattamente uno sull'altro con una Sovrapposizione, come li disegnerà l'engine.
File di testo da un modello
Un engine di cui Pixor non ha mai sentito parlare ha bisogno di un descrittore, e quello è un file di testo basato sugli stessi metadati dei fotogrammi che contiene il JSON. Un nodo File di testo ne scrive uno da un modello:
{sheet} {width}x{height}
{#frames}{name} {x} {y} {w} {h} {duration}{sep}
{/frames}
{#frames} ... {/frames} scrive il suo corpo una volta per fotogramma. Fuori da esso, le parole sono quelle dello sheet: {project}, {object}, {sheet} (il nome del file dell'immagine), {width}, {height}, {cell_w}, {cell_h}, {pivot_x}, {pivot_y}, {frames}. Dentro, quelle di un fotogramma: {name}, {id}, {action}, {side}, {row}, {index}, {n} (il numero del fotogramma sullo sheet), {layer}, {x}, {y}, {w}, {h}, {source_x}, {source_y}, {duration} (millisecondi), {pivot_x} e {pivot_y} (quelli della clip, quando un Tag gliene ha dato uno), {loop} (true o false), {root_x}, {root_y}, {root_dx} e {root_dy} (il root motion, come lo dà il JSON), {boxes} e {sockets} (in JSON), e {sep}, che è una virgola tranne dopo l'ultimo fotogramma — quanto basta per un elenco JSON. {index:3} riempie un numero con zeri; {{ e }} scrivono una graffa.
Un modello può anche stare in un file a sé accanto al progetto: dai al nodo un File modello (--set file=frames.tpl da uno script), e viene letto ogni volta che l'uscita viene scritta, così uno studio modifica il suo descrittore dove tiene gli altri file.
Non ci sono condizioni, aritmetica o inclusioni. È un modo di scrivere un file, non un linguaggio. Una parola che Pixor non conosce viene rifiutata quando si digita il modello, non scritta in un file.
Un layout usato come un solo gruppo
Una griglia di icone, un provino, il modo tutto suo di uno studio di disporre un personaggio: Salva kit… sulla barra, senza alcun gruppo scelto, salva il grafo di Asset come kit (Salva il grafo di Asset come kit): la sua disposizione, ciò che alimenta il suo Sheet, come un unico gruppo che riceve elenchi di sprite (ogni nodo Sprites diventa un ingresso) e restituisce lo sheet. Lo Sheet e i file che ne dipendono restano del progetto. + › Usa kit… (Aggiungi un kit come gruppo) lo mette nel grafo di Asset di un altro progetto come un unico gruppo, da collegare lì a uno Sheet o da mettere al posto di un Disponi. Fai doppio clic, o premi la freccia sul suo titolo, per aprirlo sul posto; la freccia lo richiude. Da uno script:
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
Cosa non fa
- I formati binari restano codice. PNG,
.aseprite, GIF, APNG, GodotSpriteFrames, i kit di luce e.p8sono nodi Sheet e File; un modello scrive testo. - Niente binari di plugin e niente nodi script, qui come negli altri grafi.
Quanto descritto in questa pagina è nella versione completa; la demo gratuita nel browser si limita al look predefinito e allo sheet PNG.
Prova nel browser Ottieni Pixor
