From 4b3b81eb520f8a88cb05263f8b63126f50bb0d4a Mon Sep 17 00:00:00 2001 From: Kaloyan Chehlarski Date: Wed, 5 Apr 2023 00:14:27 +0300 Subject: [PATCH] NANCY: Change where states are entered and exited Moved the calls to onStateEnter() and onStateExit() inside the main game loop. --- engines/nancy/nancy.cpp | 45 +++++++++++++++++++++++------------------ engines/nancy/nancy.h | 1 + 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp index 7e76e249bb2..760e50eba11 100644 --- a/engines/nancy/nancy.cpp +++ b/engines/nancy/nancy.cpp @@ -219,8 +219,6 @@ void NancyEngine::setState(NancyState::NancyState state, NancyState::NancyState break; } - _graphicsManager->clearObjects(); - if (overridePrevious != NancyState::kNone) { _gameFlow.prevState = overridePrevious; } else { @@ -228,22 +226,7 @@ void NancyEngine::setState(NancyState::NancyState state, NancyState::NancyState } _gameFlow.curState = state; - - bool shouldDestroyLastState = false; - - State::State *s = getStateObject(_gameFlow.prevState); - if (s) { - shouldDestroyLastState = s->onStateExit(_gameFlow.curState); - } - - s = getStateObject(_gameFlow.curState); - if (s) { - s->onStateEnter(_gameFlow.prevState); - } - - if (shouldDestroyLastState) { - destroyState(_gameFlow.prevState); - } + _gameFlow.changingState = true; } void NancyEngine::setToPreviousState() { @@ -274,12 +257,34 @@ Common::Error NancyEngine::run() { _cursorManager->setCursorType(CursorManager::kNormalArrow); _input->processEvents(); - State::State *s = getStateObject(_gameFlow.curState); + State::State *s; + + if (_gameFlow.changingState) { + s = getStateObject(_gameFlow.curState); + if (s) { + s->onStateEnter(_gameFlow.curState); + } + + _gameFlow.changingState = false; + } + + s = getStateObject(_gameFlow.curState); if (s) { s->process(); } - + _graphicsManager->draw(); + + if (_gameFlow.changingState) { + _graphicsManager->clearObjects(); + + s = getStateObject(_gameFlow.prevState); + if (s) { + if(s->onStateExit(_gameFlow.prevState)) { + destroyState(_gameFlow.prevState); + } + } + } _system->updateScreen(); _system->delayMillis(16); diff --git a/engines/nancy/nancy.h b/engines/nancy/nancy.h index 9903185a71b..9c4f3b0b513 100644 --- a/engines/nancy/nancy.h +++ b/engines/nancy/nancy.h @@ -133,6 +133,7 @@ private: struct GameFlow { NancyState::NancyState curState = NancyState::kNone; NancyState::NancyState prevState = NancyState::kNone; + bool changingState = true; }; void bootGameEngine();