¿Cómo manejas la separación de la animación del estado mundial dentro de un juego por turnos? Actualmente estoy trabajando en un juego basado en cuadrícula 2D. El siguiente código está simplificado para explicarlo mejor.
Cuando un actor se mueve, quiero pausar el flujo de turnos mientras la criatura se anima y se mueve a la nueva posición. De lo contrario, la pantalla podría quedar muy por detrás del estado mundial, lo que causaría una apariencia visual extraña. También quiero tener animaciones que no bloqueen el flujo del juego: un efecto de partículas podría desarrollarse en múltiples turnos sin afectar el juego.
Lo que he hecho es presentar dos tipos de animaciones, que llamo animaciones de bloqueo y animaciones sin bloqueo. Cuando el jugador quiere moverse, el código que se ejecuta es
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Entonces el ciclo principal de actualización hace:
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
}
}
... donde la animación actualiza la posición de la pantalla del actor.
Otra idea que estoy implementando es tener una animación de bloqueo concurrente, donde múltiples animaciones de bloqueo se actualizarían simultáneamente, pero el siguiente turno no sucedería hasta que se hicieran todas.
¿Parece esto una forma sensata de hacer las cosas? ¿Alguien tiene alguna sugerencia, o incluso referencias a cómo otros juegos similares hacen tal cosa?
fuente