From e1df646ace3f0b487ef810a5489c3f0c2090da71 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 16 Jul 2011 22:28:49 +1000 Subject: CGE: Set up a separate variable for the game tick speed, independent from frame rate --- engines/cge/cge.cpp | 1 + engines/cge/cge.h | 3 ++- engines/cge/cge_main.cpp | 25 ++++++++++++++++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index bb5b786330..97712591fa 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -58,6 +58,7 @@ CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription) void CGEEngine::setup() { // Initialise fields _lastFrame = 0; + _lastTick = 0; _hero = NULL; _shadow = NULL; _miniCave = NULL; diff --git a/engines/cge/cge.h b/engines/cge/cge.h index 851a1166ab..5187e57c0f 100644 --- a/engines/cge/cge.h +++ b/engines/cge/cge.h @@ -74,7 +74,7 @@ extern const char *SAVEGAME_STR; class CGEEngine : public Engine { private: - uint32 _lastFrame; + uint32 _lastFrame, _lastTick; void tick(); void syncHeader(Common::Serializer &s); static void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header); @@ -156,6 +156,7 @@ public: void setIRQ(); void setDMA(); void mainLoop(); + void handleFrame(); void saveGame(int slotNumber, const Common::String &desc); static bool readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header); void switchMusic(); diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index f3b2784ca6..ad31a5c1e6 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -1411,6 +1411,7 @@ void CGEEngine::loadScript(const char *fname) { } #define GAME_FRAME_DELAY (1000 / 50) +#define GAME_TICK_DELAY (1000 / 62) void CGEEngine::mainLoop() { sayDebug(); @@ -1432,23 +1433,37 @@ void CGEEngine::mainLoop() { _snail_->runCom(); _snail->runCom(); + // Handle a delay between game frames + handleFrame(); + + // Handle any pending events + _eventManager->poll(); +} + +void CGEEngine::handleFrame() { // Game frame delay uint32 millis = g_system->getMillis(); while (!_eventManager->_quitFlag && (millis < (_lastFrame + GAME_FRAME_DELAY))) { // Handle any pending events _eventManager->poll(); + if (millis >= (_lastTick + GAME_TICK_DELAY)) { + // Dispatch the tick to any active objects + tick(); + _lastTick = millis; + } + // Slight delay g_system->delayMillis(10); millis = g_system->getMillis(); } _lastFrame = millis; - // Dispatch the tick to any active objects - tick(); - - // Handle any pending events - _eventManager->poll(); + if (millis >= (_lastTick + GAME_TICK_DELAY)) { + // Dispatch the tick to any active objects + tick(); + _lastTick = millis; + } } void CGEEngine::tick() { -- cgit v1.2.3