Come gestisci la separazione dell'animazione dallo stato mondiale all'interno di un gioco a turni? Attualmente sto lavorando a un gioco basato su griglia 2D. Il codice seguente è semplificato per spiegare meglio.
Quando un attore si muove, voglio mettere in pausa il flusso di turni mentre la creatura si anima e si sposta nella nuova posizione. Altrimenti, lo schermo potrebbe essere significativamente indietro rispetto allo stato mondiale, il che causerebbe uno strano aspetto visivo. Voglio anche avere animazioni che non blocchino il flusso del gioco - un effetto particellare potrebbe svolgersi su più turni senza influire sul gameplay.
Quello che ho fatto è introdurre due tipi di animazioni, che io chiamo animazioni bloccanti e animazioni non bloccanti. Quando il giocatore vuole muoversi, il codice che viene eseguito è
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Quindi il ciclo di aggiornamento principale fa:
class Game {
void update(float dt) {
updateNonBlockingAnimations(dt); //Effects like particle explosions, damage numbers, etc. Things that don't block the flow of turns.
if(!mBlockingAnimations.empty()) {
mBlockingAnimations.get(0).update(dt);
} else {
//.. handle the next turn. This is where new animations will be enqueued..//
}
cleanUpAnimations(); // remove finished animations
}
}
... dove l'animazione aggiorna la posizione dello schermo dell'attore.
Un'altra idea che sto implementando è quella di avere un'animazione di blocco simultanea, in cui più animazioni di blocco sarebbero aggiornate simultaneamente, ma la svolta successiva non avverrebbe fino a quando non saranno state completate tutte.
Sembra un modo sano di fare le cose? Qualcuno ha qualche suggerimento o addirittura riferimenti a come altri giochi simili fanno una cosa del genere.