Як ви справляєтеся з відокремленням анімації від світової держави в рамках гри по черзі? Зараз я працюю над грою на 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
}
}
... де анімація оновлює положення екрана Актора.
Ще одна ідея, яку я реалізую, - це створення одночасної анімації блокування, де декілька блокуючих анімацій будуть оновлюватися одночасно, але наступна черга не відбудеться, поки всі вони не будуть виконані.
Це здається розумним способом робити речі? Хтось має якісь пропозиції чи навіть посилання на те, як інші подібні ігри роблять подібне.