ターン制ゲームでアニメーションと世界の状態の分離をどのように扱いますか?現在、2Dグリッドベースのゲームに取り組んでいます。以下のコードは、わかりやすくするために簡略化されています。
アクターが移動するとき、クリーチャーがアニメートして新しい位置に移動する間、ターンのフローを一時停止したいと思います。そうしないと、画面が世界の状態より大幅に遅れて、奇妙な外観になります。また、ゲームの流れを妨げないアニメーションが必要です。パーティクルエフェクトは、ゲームプレイに影響を与えずに複数のターンにわたって展開できます。
私がやったことは、ブロッキングアニメーションとノンブロッキングアニメーションと呼ばれる2種類のアニメーションを紹介することです。プレイヤーが移動したい場合、実行されるコードは
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
}
}
...アニメーションはアクターの画面位置を更新します。
私が実装しているもう1つのアイデアは、複数のブロッキングアニメーションが同時に更新される並行ブロッキングアニメーションを作成することですが、次のターンはそれらがすべて完了するまで発生しません。
これは物事を行うための健全な方法のように見えますか?誰かが何か提案、または他の同様のゲームがそのようなことをする方法への参照さえありますか?