EDIT: Per chiarire qual è esattamente la mia domanda: è un buon modo per gestire le animazioni / lo stato delle animazioni in un motore di gioco con un occhio alla creazione / gestione dei contenuti? Quali sono i difetti nel farlo in questo modo e quale sarebbe un modo alternativo per farlo? - Sebbene la mia risposta abbia parzialmente risposto nei commenti, poiché sembra essere la strada da percorrere.
Sto cercando di gestire le animazioni in un progetto di hobby del motore di gioco 2D , senza codificarle. Gli stati di animazione con codifica rigida mi sembrano un fenomeno comune ma molto strano.
Un po 'di storia: sto lavorando con un sistema di entità in cui i componenti sono sacchi di dati e i sottosistemi agiscono su di essi. Ho scelto di utilizzare un sistema di polling per aggiornare gli stati di animazione.
Con stati di animazione intendo: "walking_left", "running_left", "walking_right", "shooting", ...
La mia idea di gestire le animazioni era progettarla come un modello basato sui dati . I dati potrebbero essere memorizzati in un file XML, un rdbms, ... E potrebbero essere caricati all'inizio di un gioco / livello / ... In questo modo puoi facilmente modificare animazioni e transizioni senza dover cambiare il codice ovunque nel tuo gioco.
Ad esempio, ho realizzato una bozza XML delle definizioni dei dati che avevo in mente.
Un dato molto importante sarebbe semplicemente la descrizione di un'animazione . Un'animazione avrebbe un ID univoco (un nome descrittivo). Conterrebbe un ID di riferimento a un'immagine (il foglio sprite che utilizza, poiché animazioni diverse possono utilizzare fogli sprite diversi). I fotogrammi al secondo su cui eseguire l'animazione. Il "replay" qui definisce se un'animazione debba essere eseguita una volta o all'infinito. Quindi ho definito un elenco di rettangoli come cornici.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
I dati di animazione verrebbero caricati e conservati in un pool di risorse di animazione e referenziati dalle entità di gioco che li utilizzano. Sarebbe trattato come una risorsa come un'immagine, un suono, una trama, ...
Il secondo pezzo di dati da definire sarebbe una macchina a stati per gestire stati e transizioni di animazione . Questo definisce ogni stato in cui può trovarsi un'entità di gioco, in cui afferma che può passare e che cosa fa scattare quel cambiamento di stato.
Questa macchina a stati differirebbe da un'entità all'altra. Perché un uccello potrebbe avere stati "camminare" e "volare" mentre un essere umano avrebbe solo lo stato "camminare". Tuttavia potrebbe essere condiviso da entità diverse perché più umani probabilmente avranno gli stessi stati (specialmente quando si definiscono alcuni NPC comuni come mostri, ecc.). Inoltre un orco potrebbe avere gli stessi stati di un essere umano. Giusto per dimostrare che questa definizione di stato potrebbe essere condivisa, ma solo da un gruppo selezionato di entità di gioco .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Questi stati possono essere gestiti da un sistema di polling . Ogni spunta di gioco prende lo stato corrente di un'entità di gioco e controlla tutti i trigger. Se viene soddisfatta una condizione, cambia lo stato dell'entità nello stato "goto".
L'ultima parte con cui stavo lottando era come legare i dati e gli stati di animazione a un'entità . L'approccio più logico mi è sembrato di aggiungere un puntatore ai dati della macchina a stati che un'entità utilizza e di definire per ogni stato in quella macchina quale animazione utilizza.
Ecco un esempio xml di come definirei il comportamento dell'animazione e la rappresentazione grafica di alcune entità comuni in un gioco, rivolgendomi allo stato e all'ID dei dati di animazione. Si noti che sia "procedura guidata" che "orco" hanno gli stessi stati di animazione ma un'animazione diversa. Inoltre, un'animazione diversa potrebbe significare un foglio sprite diverso o anche una diversa sequenza di animazioni (un'animazione potrebbe essere più lunga o più corta).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Quando viene creata l'entità, viene aggiunto un elenco di stati con dati della macchina a stati e un riferimento ai dati di animazione.
In futuro userò il sistema di entità per costruire intere entità definendo i componenti in un formato XML simile.
-
Questo è quello che ho escogitato dopo alcune ricerche. Tuttavia ho avuto qualche problema a pensarci bene, quindi speravo in un feedback. C'è qualcosa qui che non ha senso o c'è un modo migliore per gestire queste cose? Ho afferrato l'idea di iterare attraverso i frame, ma ho difficoltà a fare un passo avanti e questo è il mio tentativo di farlo.