Come posso gestire fogli sprite con dimensioni sprite non uniformi?


14

Per un foglio di calcolo con dimensioni di sprite non uniformi , come posso ottenere i rettangoli di delimitazione per ogni singolo sprite (ovvero le caselle blu nell'immagine seguente / ho disegnato solo alcuni esempi)?

Quello che vorrei determinare sono: offset_x, offset_y, width, height

inserisci qui la descrizione dell'immagine

Finora ho usato solo fogli di calcolo su cui tutti gli sprite hanno dimensioni identiche . In tal caso, è sufficiente specificare l'offset xe y per ottenere uno sprite particolare. Tuttavia, per fogli di calcolo di dimensioni non uniformi questo non funziona.

EDIT: dopo aver letto i commenti e le risposte, ho riformulato la mia domanda per renderlo più inclusivo. il processo effettivo di utilizzo di un foglio di calcolo in un gioco. In precedenza, la domanda conteneva i punti per cui le persone producono fogli di calcolo di dimensioni non uniformi e come posso gestirlo.


1
Mi sembra che abbiano tutte dimensioni identiche, lo spazio che non viene riempito per colore è solo pixel con l'alfa impostato su zero.
Derek,

Risposte:


8

La maggior parte dei fogli sprite di dimensioni non identiche di solito hanno una sorta di metadati con dove si trova l'ancora dello sprite. Ci sono molti strumenti che fanno cose come eliminare i pixel alfa completi e ti danno i dati di cui hai bisogno in modo che questi dati non vengano generati manualmente.

Se non disponi di questi metadati, devi crearli tu stesso. Il modo più preciso è quello che hai detto nella tua domanda, che è semplicemente farlo a mano. Potrebbe volerci un po ', ma probabilmente è più veloce di fare nuovi sprite.


Questo - mentre gli approcci basati sul rilevamento automatico hanno i loro usi, in pratica sono pignoli e soggetti a errori. È già bisogno di metadati per l'origine dello sprite (i tuoi sprite fare avere un'origine, giusto?), Quindi i dati in più non è certo troppo di un onere. L'artista dovrebbe sempre sapere meglio della tua app quali sono le dimensioni dei singoli sprite.
Steven Stadnicki,

+1. Fornire metadati con gli sprite è garantito per risolverlo in modo sano .
Bartek Banachewicz,

5

Puoi eseguire analisi sull'immagine per individuare i rettangoli di delimitazione di ogni sprite, ordinare quei rettangoli di delimitazione (forse aumentando il minimo X, quindi Y) e avrai un insieme di regioni di delimitazione che corrispondono ai frame del foglio sprite.

Poiché questo processo può essere relativamente costoso, probabilmente vorrai farlo offline, ad esempio come parte del processo di generazione del tuo gioco. È quindi possibile serializzare le informazioni sulla regione di delimitazione in un file memorizzato con l'immagine del foglio sprite corrispondente. In fase di runtime carichi sia l'immagine che il file di definizione del confine e hai le informazioni necessarie per accedere a ogni singolo sprite.

Questo è più facile a dirsi che a farsi, però. Fondamentalmente ti consigliamo di eseguire il rilevamento delle funzionalità e in particolare il rilevamento BLOB che sono problemi di visione artificiale. È inoltre possibile impostare la soglia dell'immagine (su bianco e nero) e utilizzare una tecnica di rilevamento dei bordi . La matematica pertinente alla base di queste tecniche è spiegata molto meglio su quei collegamenti di quanto potessi io, e nel caso in cui non ti senti in grado di implementare quella matematica da solo, ci sono alcune librerie disponibili che possono aiutarti. La seguente serie di collegamenti mi è sembrata la più promettente:


1
+1. Sono d'accordo che occorreranno alcune abilità di percezione del computer / manipolazione delle immagini per trovare i limiti di sprite corretti. A volte potrebbe anche essere impossibile, ad esempio se guardi la tartaruga per proiettare l'animazione. Sarà difficile determinare la posizione corretta per quella relativa agli altri frame di animazione. E per quanto riguarda il perché : è molto probabile a causa dell'uso ottimale dello spazio delle trame. E di solito un file con le coordinate dovrebbe essere fornito con un tale spritesheet, ma se lo stai semplicemente prendendo dalla ricerca di immagini di Google, potrebbero non avere queste informazioni.
Bummzack,

Sollevi un buon punto: la mia risposta non affronta il problema delle origini degli sprite; porterebbe solo a trovare rettangoli di delimitazione aderenti e, per un foglio con folletti non uniformi, conoscere l'origine di ciascun fotogramma è abbastanza importante. Questo sarebbe difficile da fare automaticamente se non avessi fatto delle ipotesi (probabilmente specifiche del dominio), ad esempio che l'origine sarebbe sempre (larghezza / 2, massimo Y) o qualcosa del genere.

4

Ho creato il mio strumento per quel tipo di spritesheet non uniforme. Permette di modificare offset, eccetera. Ecco uno screenshot per darti un'idea:

inserisci qui la descrizione dell'immagine


Sembra che tu abbia creato un foglio di calcolo uniforme contenente solo un'animazione da quella non uniforme? O sto interpretando male questo?
Ben

no, apro uno spritesheet non uniforme e disegno un rettangolo attorno agli sprite (che si restringe automaticamente alla dimensione corretta). Una volta ho creato un'animazione ripetendo che posso riprodurre ogni animazione e regolare l'offset in base alle mie esigenze.
Anonymouse,

Sembra uno strumento molto pulito che hai creato lì. Ti va di condividere lo strumento?
eckyputrady,

@eckyputrady, mi dispiace ma è lungi dall'essere completo ma raccomando un altro strumento (che mi ha ispirato in fondo). Puoi trovarlo qui: colourclash.com/sprite_buddy/sprite_buddy.html
Anonymouse

0

Dai un'occhiata a texturepacker

http://www.texturepacker.com/

Emette un file come questo (a seconda delle impostazioni preffered)

    {
    "filename": "image_front_1",
    "frame": {"x":1,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":2,"w":36,"h":40},
    "sourceSize": {"w":36,"h":40}
},
{
    "filename": "image_front_2.png",
    "frame": {"x":36,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":36,"h":42},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_3.png",
    "frame": {"x":71,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_4.png",
    "frame": {"x":106,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
}

Usando questi dati, puoi facilmente afferrare i rettangoli separati dall'immagine.


Questa non è una tecnologia su cui utilizzare la domanda. A mio avviso, semplicemente rispondere con un collegamento a uno strumento e un esempio del suo output non è sufficiente.
MichaelHouse

-1

spritebuddy.com ha funzionato benissimo per me. Non è stato possibile trovare alcun aiuto sul sito stesso, ma questo post di Google Gruppi lo spiega davvero bene. Indovina automaticamente i limiti per i tuoi sprite, ti consente di regolarli e ti consente di disporli in sequenze di animazione. Quindi sputa un file di metadati per tutto ciò in JSON o XML. Quindi tutto ciò che devi fare è analizzare quel file di dati nel tuo gioco per ottenere i rettangoli di delimitazione corretti.


1
Questa non è una tecnologia su cui utilizzare la domanda. Inoltre, questo strumento è già stato suggerito in uno dei commenti.
MichaelHouse

Ho aggiornato la mia risposta, ma non sono d'accordo sul fatto che non risponda alla domanda del PO: "Quello che vorrei determinare sono: offset_x, offset_y, larghezza, altezza". Non deve essere specificato se ciò debba accadere durante il gioco (che sarebbe terribilmente non performante) o prima. Per quanto riguarda "EDIT: [...] ho riformulato la mia domanda per renderlo più inclusivo rispetto al processo effettivo di utilizzo di uno spritesheet in un gioco", questo è il mio processo. Genero il file JSON appropriato usando spritebuddy, quindi lo analizzo nel mio gioco per ottenere i dati di cui ho bisogno.
CletusW,

1
@CletusW: buone risposte spiegherebbero perché quello strumento funziona così bene per il tuo processo, cosa fa e come aiuta, ecc. Dovrei essere in grado di leggere la tua risposta e quindi sapere come selezionare uno strumento o scriverne uno mio. Se ti colleghi al tuo esempio preferito, questo è solo un bonus, non la carne della risposta.
Sean Middleditch il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.