Jak radzisz sobie z oddzieleniem animacji od stanu świata w grze turowej? Obecnie pracuję nad grą opartą na siatce 2D. Poniższy kod jest uproszczony, aby lepiej wyjaśnić.
Kiedy aktor się porusza, chcę zatrzymać przepływ zwrotów, podczas gdy stworzenie animuje i przesuwa się do nowej pozycji. W przeciwnym razie ekran mógłby znacznie opóźnić się w stosunku do stanu na świecie, co spowodowałoby dziwny wygląd. Chcę też mieć animacje, które nie blokują przebiegu gry - efekt cząsteczkowy może się rozwijać w wielu turach bez wpływu na rozgrywkę.
Wprowadziłem dwa rodzaje animacji, które nazywam animacjami blokującymi i animacjami nieblokującymi. Gdy gracz chce się przenieść, wykonywany jest kod
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Następnie główna pętla aktualizacji wykonuje:
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
}
}
... gdzie animacja aktualizuje pozycję ekranową aktora.
Innym pomysłem, który wdrażam, jest współbieżna animacja blokująca, w której wiele animacji blokujących byłoby aktualizowanych jednocześnie, ale następna tura nie miałaby miejsca, dopóki wszystkie nie zostaną wykonane.
Czy to wydaje się rozsądnym sposobem robienia rzeczy? Czy ktoś ma jakieś sugestie, a nawet odniesienia do tego, jak inne podobne gry robią takie rzeczy.
źródło