diff options
author | richiesams | 2013-08-19 23:51:50 -0500 |
---|---|---|
committer | richiesams | 2013-08-20 11:41:36 -0500 |
commit | 6e427ebef8b29e48b679c7c19ed4b715c7dfaef8 (patch) | |
tree | d19ee2880c51d8a5dccdbcacff4efc6506fca8be /engines | |
parent | 683e24cd75e629061a7f5d0733b29daf10bba2ec (diff) | |
download | scummvm-rg350-6e427ebef8b29e48b679c7c19ed4b715c7dfaef8.tar.gz scummvm-rg350-6e427ebef8b29e48b679c7c19ed4b715c7dfaef8.tar.bz2 scummvm-rg350-6e427ebef8b29e48b679c7c19ed4b715c7dfaef8.zip |
ZVISION: Create method to play RlfAnimations
Diffstat (limited to 'engines')
-rw-r--r-- | engines/zvision/animation.cpp | 90 | ||||
-rw-r--r-- | engines/zvision/zvision.h | 3 |
2 files changed, 93 insertions, 0 deletions
diff --git a/engines/zvision/animation.cpp b/engines/zvision/animation.cpp new file mode 100644 index 0000000000..7c41c23a06 --- /dev/null +++ b/engines/zvision/animation.cpp @@ -0,0 +1,90 @@ +/* ScummVM - Graphic Adventure Engine +* +* ScummVM is the legal property of its developers, whose names +* are too numerous to list here. Please refer to the COPYRIGHT +* file distributed with this source distribution. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +*/ + +#include "common/scummsys.h" + +#include "common/system.h" + +#include "zvision/zvision.h" +#include "zvision/rlf_animation.h" + + +namespace ZVision { + +void ZVision::playAnimation(RlfAnimation *animation, uint16 x, uint16 y, DisposeAfterUse::Flag disposeAfterUse) { + uint currentFrame = 0; + uint lastFrame = animation->frameCount(); + bool skip = false; + uint32 frameTime = animation->frameTime(); + uint width = animation->width(); + uint height = animation->height(); + + uint16 newX = x + _workingWindow.left; + uint16 newY = y + _workingWindow.top; + + uint32 accumulatedTime = 0; + + // Only continue while the video is still playing + while (!shouldQuit() && !skip && currentFrame < lastFrame) { + _clock.update(); + uint32 currentTime = _clock.getLastMeasuredTime(); + accumulatedTime += _clock.getDeltaTime(); + + // Check for engine quit and video stop key presses + while (_eventMan->pollEvent(_event)) { + switch (_event.type) { + case Common::EVENT_KEYDOWN: + switch (_event.kbd.keycode) { + case Common::KEYCODE_q: + if (_event.kbd.hasFlags(Common::KBD_CTRL)) + quitGame(); + break; + case Common::KEYCODE_SPACE: + skip = true; + break; + default: + break; + } + default: + break; + } + } + + if (accumulatedTime >= frameTime) { + accumulatedTime -= frameTime; + + _system->copyRectToScreen(animation->getFrameData(currentFrame), width * sizeof(uint16), newX, newY, width, height); + currentFrame++; + } + + // Always update the screen so the mouse continues to render + _system->updateScreen(); + + // Calculate the frame delay based off a desired frame time + int delay = _desiredFrameTime - int32(_system->getMillis() - currentTime); + // Ensure non-negative + delay = delay < 0 ? 0 : delay; + _system->delayMillis(delay); + } +} + +} // End of namespace ZVision diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h index 9e9d5db951..366e96f6a7 100644 --- a/engines/zvision/zvision.h +++ b/engines/zvision/zvision.h @@ -49,6 +49,7 @@ class Console; class ScriptManager; class RenderManager; class CursorManager; +class RlfAnimation; // our engine debug channels enum { @@ -126,6 +127,8 @@ public: */ void playVideo(Video::VideoDecoder &videoDecoder, const Common::Rect &destRect = Common::Rect(0, 0, 0, 0), bool skippable = true); + void playAnimation(RlfAnimation *animation, uint16 x, uint16 y, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + /** * Register a MouseEvent with the event system. These will be checked at every * MOUSE_UP, MOUSE_DOWN, MOUSE_MOVE, etc. |