Como você lida com a separação da animação do estado mundial em um jogo baseado em turnos? Atualmente, estou trabalhando em um jogo baseado em grade 2D. O código abaixo é simplificado para melhor explicar.
Quando um ator se move, quero pausar o fluxo de voltas enquanto a criatura anima e se move para a nova posição. Caso contrário, a tela poderá ficar significativamente atrás do estado mundial, o que causaria uma aparência visual estranha. Eu também quero ter animações que não bloqueiem o fluxo do jogo - um efeito de partícula pode se desdobrar em vários turnos sem afetar a jogabilidade.
O que eu fiz foi introduzir dois tipos de animações, as quais eu chamo de animações de bloqueio e de não-bloqueio. Quando o jogador quer se mover, o código que é executado é
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Em seguida, o loop principal de atualização:
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
}
}
... onde a animação atualiza a posição da tela do ator.
Uma outra idéia que estou implementando é ter uma animação de bloqueio simultânea, na qual várias animações de bloqueio serão atualizadas simultaneamente, mas a próxima etapa não acontecerá até que todas elas estejam concluídas.
Parece uma maneira sensata de fazer as coisas? Alguém tem alguma sugestão ou mesmo referência a como outros jogos semelhantes fazem uma coisa dessas.