Wie gehen Sie mit der Trennung von Animation und Weltzustand in einem rundenbasierten Spiel um? Ich arbeite derzeit an einem 2D-Grid-basierten Spiel. Der folgende Code wird zur besseren Erläuterung vereinfacht.
Wenn sich ein Schauspieler bewegt, möchte ich den Fluss der Runden unterbrechen, während die Kreatur animiert und sich an die neue Position bewegt. Andernfalls könnte der Bildschirm erheblich hinter dem Weltzustand zurückbleiben, was zu einem seltsamen visuellen Erscheinungsbild führen würde. Ich möchte auch Animationen haben, die den Spielfluss nicht blockieren - ein Partikeleffekt kann sich über mehrere Runden entfalten, ohne das Gameplay zu beeinträchtigen.
Ich habe zwei Arten von Animationen eingeführt, die ich blockierende Animationen und nicht blockierende Animationen nenne. Wenn der Spieler sich bewegen möchte, lautet der Code, der ausgeführt wird
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Dann macht die Hauptaktualisierungsschleife:
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
}
}
... wo die Animation die Bildschirmposition des Schauspielers aktualisiert.
Eine andere Idee, die ich implementiere, ist eine gleichzeitige Blockierungsanimation, bei der mehrere Blockierungsanimationen gleichzeitig aktualisiert werden, die nächste Runde jedoch erst stattfinden würde, wenn alle abgeschlossen sind.
Scheint dies eine vernünftige Art zu sein, Dinge zu tun? Hat jemand irgendwelche Vorschläge oder sogar Hinweise darauf, wie andere ähnliche Spiele so etwas tun?