Как вы справляетесь с отделением анимации от состояния мира в пошаговой игре? Сейчас я работаю над 2D-сеткой. Приведенный ниже код упрощен, чтобы лучше объяснить.
Когда актер движется, я хочу приостановить ход поворотов, пока существо оживляет и перемещается в новую позицию. В противном случае экран может значительно отставать от состояния мира, что может привести к странному внешнему виду. Я также хочу иметь анимацию, которая не блокирует ход игры - эффект частиц может разворачиваться в течение нескольких ходов, не влияя на игровой процесс.
Я представил два типа анимации, которые я называю блокирующими и неблокирующими. Когда игрок хочет двигаться, исполняемый код
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Затем основной цикл обновления выполняет:
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
}
}
... где анимация обновляет положение экрана актера.
Еще одна идея, которую я реализую, заключается в том, чтобы иметь параллельную анимацию блокировки, при которой несколько анимаций блокировки будут обновляться одновременно, но следующий поворот не произойдет, пока все они не будут выполнены.
Это похоже на разумный способ сделать что-то? Есть ли у кого-нибудь какие-либо предложения, или даже ссылки на то, как другие подобные игры делают такое.
источник