在回合制游戏中,您如何处理动画与世界状态的分离?我目前正在开发基于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
}
}
...动画会更新Actor的屏幕位置。
我正在实现的另一个想法是有一个并发的阻塞动画,其中多个阻塞动画将被同时更新,但是直到所有动画都完成后,下一轮才会发生。
这似乎是理智的做事方式吗?有没有人有任何建议,甚至没有提到其他类似游戏如何做到这一点。