Best practice per l'animazione Sprite


18

Mi piacerebbe capire meglio come le persone nel mondo reale gestiscono la loro animazione.

Carichi 1 immagine grande e quindi disegni rettangoli diversi in base al riquadro di animazione?

Carichi file di immagine X in un array e disegni l'elemento nell'array in base al riquadro di animazione?

Come gestisci avere diverse lunghezze di animazioni per vari sprite.

Supponi che un personaggio che cammina prende 4 - 8 fotogrammi e che le onde sulla spiaggia prendano solo 2 - 3 fotogrammi. Come gestiresti quella situazione? Vedi sotto

Dim Waves(1) as Sprite
Dim Char(5) as Sprite

Sub Animate()
     Frame += 1
     Draw Char(Frame)
     Draw Waves(Frame)
     If Frame = 5 Then Frame = 0
End Sub

Ovviamente Waves finirebbe con un errore fuori limite.

O hai il tuo sprite preoccupato per la propria animazione e non ti preoccupi affatto del frame. Avere ogni sprite a conoscere il proprio ciclo di animazione?

Risposte:


23

Il modo in cui l'ho fatto in passato è separando i dati dell'animazione dalla riproduzione dell'animazione . Un Animationpuò quindi diventare fondamentalmente un array di Framese alcune proprietà che descrivono come dovrebbe comportarsi l'animazione (se si sviluppa in loop, ecc.).

In genere carico un'immagine e ne disegna pezzi.

Ciascuna Frameanimazione è essenzialmente un rettangolo e un periodo di tempo. Ciò consente ad alcuni frame di essere visualizzati più a lungo di altri, che possono essere o meno qualcosa che desideri. Se si desidera che tutti i fotogrammi nell'animazione vengano visualizzati per lo stesso periodo di tempo, memorizzarli Animationnell'oggetto.

Tutto ciò che ha bisogno di riprodurre un'animazione ha il suo AnimationPlayerche può essere indicato con un Animation. L'oggetto giocatore si occupa della riproduzione dell'animazione e rende disponibile il "fotogramma corrente".

Il vantaggio per me era che potevo avere una singola istanza di un oggetto Animationche molti oggetti potevano indicare e che suonavano parti diverse contemporaneamente. È stato anche facile cambiare le animazioni semplicemente indicando AnimationPlayerun Animationoggetto diverso e ripristinando la riproduzione.

Modifica : ecco un'implementazione JavaScript abbastanza semplice del sistema sopra descritto . L'ho gettato insieme in pochi minuti come dimostrazione . Il codice "reale" avrebbe più funzionalità. Tuttavia, avrai bisogno di un browser moderno che supporti sia URI Canvas che Data.


1
Cosa ha detto. Inoltre, è spesso utile avere un offset x / y per ciascun fotogramma in un'animazione in modo da poter racchiudere strettamente le immagini sprite nelle loro caselle di delimitazione ma poi posizionarle dove si desidera in un'animazione. Ti permette anche di fare alcune cose di base come il jiggling semplicemente usando una singola immagine.
munifico

Sì, sono completamente d'accordo. In effetti, il sistema di animazione che sto usando lo consente. Rende molto più semplice cambiare la posizione di qualsiasi fotogramma senza dover modificare i dati dell'immagine.
Zack The Human

Bell'esempio di lavoro, WOW Thumbs up. Lo consiglierei.
DFectuoso,

Un'importante limitazione del tipo di animazione è che la figura non può essere vista da un'angolazione diversa: allontanarsi dallo spettatore, camminare verso lo spettatore, ecc. O sbaglio?
Majid Fouladpour,

@MajidFouladpour Non penso che questo tipo di limitazione esista usando questa tecnica. Hai semplicemente diversi oggetti AnimationData per ogni "angolo di visione".
Zack The Human,

1

Vorrei che un'animazione sapesse quanti fotogrammi ha. Dove e come vengono archiviati è relativamente irrilevante, tranne per i problemi di prestazioni (come potresti volerli nella stessa trama). Non aggiungerei mai 1 al framecount, aggiungerei deltaTime * animSpeed ​​e convertirò quel valore in un numero intero durante la visualizzazione. In questo modo è possibile rallentare o accelerare le animazioni e essere indipendenti dal framerate.

Quindi uno sprite avrebbe un'animazione che si aggiorna da sola.


0

Perché non solo avere un numero di frame per ciascuno dei tuoi oggetti memorizzati? Personalmente passo il numero di fotogrammi nell'animazione ai miei oggetti nei loro costruttori, quindi ho una funzione standard di Animate () che accetta la quantità di fotogrammi nell'animazione.


0

Dipende dall'implementazione. Nel mio motore, faccio animazione sia in Direct3D che in DirectDraw.

In DirectDraw creo un'immagine grande. Tutto viene comunque archiviato nella memoria di sistema, che alla fine si riduce a un blocco di dati unidimensionale.

Professionisti:

  • Facile da spostare tra i frame. Cambia il puntatore iniziale, aggiungi l'altezza (la larghezza totale dell'immagine) ogni y e sei d'oro.

Contro:

  • Non puoi semplicemente copiare un fotogramma sullo schermo, devi farlo manualmente.

  • Blocco di memoria gigante. Trambusto di cornici intorno arriva a una penalità.

In Direct3D uso trame separate. Questo perché non ho idea dei limiti di trama di un dispositivo, quindi non so se supporta anche trame delle dimensioni dell'intera immagine.

Professionisti:

  • Puoi copiare una cornice direttamente sullo schermo, perché sono tutte entità separate.

Contro:

  • Mancanza di allineamento della memoria.

0

Nei miei giochi , ho dato alla mia classe di base Sprite la conoscenza di come disegnare se stessa e tutti gli elementi animati ereditano tale conoscenza: numero e durata dei fotogrammi di animazione, posizione sullo schermo, ecc. Il ciclo di gioco principale scorre solo attraverso degli sprite, chiedendo a ciascuno di disegnare se stesso come meglio crede. Sembra funzionare abbastanza bene ed è un po 'più modulare per l'avvio: se aggiungi un nuovo sprite con un ciclo di animazione diverso (o anche più complesso: più stati di animazione), non devi tornare indietro e riscrivere il tuo Animate () routine per soddisfare la complessità aggiuntiva:

Dim Waves as Sprite
Dim Char as Sprite

Sub Animate()
     Char.update()
     Waves.update()
End Sub

Ogni volta che viene chiamato il metodo update () di uno sprite, sa se deve ridisegnare lo stesso frame dell'ultima volta, passare al frame successivo nella sua animazione corrente, passare a una nuova animazione, ecc.

Ciò ha l'ulteriore vantaggio di rendere molto più semplice regolare il framerate per adattarsi alle diverse velocità di rendering di clock / piattaforma, perché l'unica modifica è la frequenza con cui si chiama Animate ().

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.