Comment gérez-vous la séparation de l'animation de l'état mondial dans un jeu au tour par tour? Je travaille actuellement sur un jeu basé sur une grille 2D. Le code ci-dessous est simplifié pour mieux expliquer.
Lorsqu'un acteur se déplace, je veux interrompre le flux de tours pendant que la créature s'anime et se déplace vers sa nouvelle position. Sinon, l'écran pourrait être considérablement en retard sur l'état du monde, ce qui provoquerait une apparence visuelle étrange. Je veux également avoir des animations qui ne bloquent pas le déroulement du jeu - un effet de particules pourrait se dérouler sur plusieurs tours sans affecter le gameplay.
Ce que j'ai fait, c'est introduire deux types d'animations, que j'appelle des animations bloquantes et des animations non bloquantes. Lorsque le joueur veut se déplacer, le code qui est exécuté est
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Ensuite, la boucle de mise à jour principale fait:
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
}
}
... où l'animation met à jour la position à l'écran de l'acteur.
Une autre idée que j'implémente est d'avoir une animation de blocage simultanée, où plusieurs animations de blocage seraient mises à jour simultanément, mais le prochain tour ne se produirait pas avant qu'elles ne soient toutes terminées.
Cela vous semble-t-il une manière saine de faire les choses? Quelqu'un a-t-il des suggestions ou même des références à la façon dont d'autres jeux similaires font une telle chose?