diff options
author | Matthew Stewart | 2018-05-12 20:48:39 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | fc89135a16439c7d3b2268038a691e8aa8d6ee50 (patch) | |
tree | 3630f711315389ba231947796fe0cddaf27bee03 | |
parent | d375429abef0109a483970975b053292efa4bd6e (diff) | |
download | scummvm-rg350-fc89135a16439c7d3b2268038a691e8aa8d6ee50.tar.gz scummvm-rg350-fc89135a16439c7d3b2268038a691e8aa8d6ee50.tar.bz2 scummvm-rg350-fc89135a16439c7d3b2268038a691e8aa8d6ee50.zip |
STARTREK: Get animation timing working properly
-rw-r--r-- | engines/startrek/events.cpp | 47 | ||||
-rw-r--r-- | engines/startrek/startrek.cpp | 48 | ||||
-rw-r--r-- | engines/startrek/startrek.h | 3 |
3 files changed, 58 insertions, 40 deletions
diff --git a/engines/startrek/events.cpp b/engines/startrek/events.cpp index a37ae8c7a4..02b0112136 100644 --- a/engines/startrek/events.cpp +++ b/engines/startrek/events.cpp @@ -23,9 +23,56 @@ namespace StarTrek { +void StarTrekEngine::pollSystemEvents() { + Common::Event event; + TrekEvent trekEvent; + + while (_eventMan->pollEvent(event)) { + trekEvent.mouse = event.mouse; + trekEvent.kbd = event.kbd; + + switch (event.type) { + case Common::EVENT_QUIT: + _system->quit(); + break; + + case Common::EVENT_MOUSEMOVE: + trekEvent.type = TREKEVENT_MOUSEMOVE; + addEventToQueue(trekEvent); + break; + case Common::EVENT_LBUTTONDOWN: + trekEvent.type = TREKEVENT_LBUTTONDOWN; + addEventToQueue(trekEvent); + break; + default: + break; + } + } + + if (_eventQueue.empty()) { + int delay = 1000/18.206 - (_system->getMillis() - _frameStartMillis); + + _clockTicks++; + while (delay < 0) { // Check if we're behind... + delay += 1000/18.206; + _clockTicks++; + } + _system->delayMillis(delay); + + _frameStartMillis = _system->getMillis(); + + TrekEvent tickEvent; + tickEvent.type = TREKEVENT_TICK; + tickEvent.tick = _clockTicks; + addEventToQueue(tickEvent); + } + +} + void StarTrekEngine::initializeEventsAndMouse() { _mouseMoveEventInQueue = false; _tickEventInQueue = false; + _frameStartMillis = _system->getMillis(); // TODO: mouse } diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp index 8b05a5a3d2..c1c9336968 100644 --- a/engines/startrek/startrek.cpp +++ b/engines/startrek/startrek.cpp @@ -134,6 +134,8 @@ Common::Error StarTrekEngine::runGameMode(int mode) { _gameMode = GAMEMODE_BRIDGE; while (true) { + TrekEvent event; + if (_gameMode != _lastGameMode) { // Cleanup previous game mode switch (_lastGameMode) { @@ -183,10 +185,13 @@ Common::Error StarTrekEngine::runGameMode(int mode) { // Run current game mode switch (_gameMode) { case GAMEMODE_BRIDGE: + popNextEvent(&event); //runBridge(); break; case GAMEMODE_AWAYMISSION: + popNextEvent(&event); + _system->updateScreen(); //runAwayMission(); break; @@ -280,42 +285,6 @@ Room *StarTrekEngine::getRoom() { return _room; } -void StarTrekEngine::pollSystemEvents() { - Common::Event event; - TrekEvent trekEvent; - - while (_eventMan->pollEvent(event)) { - trekEvent.mouse = event.mouse; - trekEvent.kbd = event.kbd; - - switch (event.type) { - case Common::EVENT_QUIT: - _system->quit(); - break; - - case Common::EVENT_MOUSEMOVE: - trekEvent.type = TREKEVENT_MOUSEMOVE; - addEventToQueue(trekEvent); - break; - case Common::EVENT_LBUTTONDOWN: - trekEvent.type = TREKEVENT_LBUTTONDOWN; - addEventToQueue(trekEvent); - break; - default: - break; - } - } - - // FIXME: get the actual duration of a tick right - _clockTicks++; - TrekEvent tickEvent; - tickEvent.type = TREKEVENT_TICK; - tickEvent.tick = _clockTicks; - addEventToQueue(tickEvent); - - _system->delayMillis(1000/60); -} - void StarTrekEngine::playSoundEffectIndex(int index) { switch (index) { case 0x04: @@ -423,7 +392,7 @@ void StarTrekEngine::updateObjectAnimations() { switch (object->animType) { case 0: case 2: - if (object->frameToStartNextAnim >= _frameIndex) { + if (_frameIndex >= object->frameToStartNextAnim) { int nextAnimIndex = 0; // TODO: "chooseNextAnimFrame" function object->animFile->seek(18 + nextAnimIndex + object->animFrame * 22, SEEK_SET); byte nextAnimFrame = object->animFile->readByte(); @@ -459,17 +428,18 @@ void StarTrekEngine::updateObjectAnimations() { memset(object->animationString4, 0, 16); strncpy(object->animationString4, animFrameFilename, 15); - object->animFile->seek(10, SEEK_SET); + object->animFile->seek(10 + object->animFrame * 22, SEEK_SET); uint16 xOffset = object->animFile->readUint16(); uint16 yOffset = object->animFile->readUint16(); uint16 basePriority = object->animFile->readUint16(); + uint16 frames = object->animFile->readUint16(); sprite->pos.x = xOffset + object->field5e; sprite->pos.y = yOffset + object->field60; sprite->drawPriority = _gfx->getPriValue(0, yOffset + object->field60) + basePriority; sprite->bitmapChanged = true; - object->frameToStartNextAnim = object->animFile->readUint16() + _frameIndex; + object->frameToStartNextAnim = frames + _frameIndex; } } break; diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h index 6cb175c689..921d655f38 100644 --- a/engines/startrek/startrek.h +++ b/engines/startrek/startrek.h @@ -116,7 +116,6 @@ public: // Running the game Room *getRoom(); - void pollSystemEvents(); void playSoundEffectIndex(int index); void playSpeech(const Common::String &filename); @@ -136,6 +135,7 @@ public: // Events public: + void pollSystemEvents(); void initializeEventsAndMouse(); bool getNextEvent(TrekEvent *e); void removeNextEvent(); @@ -156,6 +156,7 @@ private: Common::List<TrekEvent> _eventQueue; bool _mouseMoveEventInQueue; bool _tickEventInQueue; + uint32 _frameStartMillis; public: // Detection related functions |