diff options
author | Denis Kasak | 2009-07-24 01:54:13 +0000 |
---|---|---|
committer | Denis Kasak | 2009-07-24 01:54:13 +0000 |
commit | a2bca06b3fe00379d8accf29e7f442fe0a3cd781 (patch) | |
tree | 51ece4e3f0baf6da31dbf89905373f356a6945fe /engines | |
parent | 1726cc8d247f2ad8ac5b4136b866055d3e30155b (diff) | |
download | scummvm-rg350-a2bca06b3fe00379d8accf29e7f442fe0a3cd781.tar.gz scummvm-rg350-a2bca06b3fe00379d8accf29e7f442fe0a3cd781.tar.bz2 scummvm-rg350-a2bca06b3fe00379d8accf29e7f442fe0a3cd781.zip |
Added support for per-animation scaling (via scaling factors). I have decided to go for a mixed approach (where Animation has a global scaling factor for the whole animation which is separate from Drawable's scaled width and height) so the animation can be scaled more naturally when the scale often changes (like with perspective when the dragon is walking). Previously, one had to alter the sizes of each frame of the dragon's animation whenever the dragon moved which was unclean.
svn-id: r42680
Diffstat (limited to 'engines')
-rw-r--r-- | engines/draci/animation.cpp | 24 | ||||
-rw-r--r-- | engines/draci/animation.h | 5 | ||||
-rw-r--r-- | engines/draci/game.cpp | 14 |
3 files changed, 31 insertions, 12 deletions
diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp index adcb8e2d82..74e876401d 100644 --- a/engines/draci/animation.cpp +++ b/engines/draci/animation.cpp @@ -33,6 +33,8 @@ Animation::Animation(DraciEngine *vm) : _vm(vm) { _z = 0; _relX = 0; _relY = 0; + _scaleX = 1.0; + _scaleY = 1.0; _playing = false; _looping = false; _tick = _vm->_system->getMillis(); @@ -69,6 +71,10 @@ void Animation::markDirtyRect(Surface *surface) { // Translate rectangle to compensate for relative coordinates frameRect.translate(_relX, _relY); + + // Take animation scaling into account + frameRect.setWidth(frameRect.width() * _scaleX); + frameRect.setHeight(frameRect.height() * _scaleY); // Mark the rectangle dirty on the surface surface->markDirtyRect(frameRect); @@ -141,12 +147,23 @@ void Animation::drawFrame(Surface *surface) { frame->setX(newX); frame->setY(newY); + // Save scaled width and height + int scaledWidth = frame->getScaledWidth(); + int scaledHeight = frame->getScaledHeight(); + + // Take into account per-animation scaling and adjust the current frames dimensions + if (_scaleX != 1.0 || _scaleY != 1.0) + frame->setScaled(scaledWidth * _scaleX, scaledHeight * _scaleY); + // Draw frame frame->drawScaled(surface, false); // Revert back to old coordinates frame->setX(x); frame->setY(y); + + // Revert back to old dimensions + frame->setScaled(scaledWidth, scaledHeight); } } @@ -183,6 +200,13 @@ void Animation::setPlaying(bool playing) { _playing = playing; } +void Animation::setScaleFactors(double scaleX, double scaleY) { + markDirtyRect(_vm->_screen->getSurface()); + + _scaleX = scaleX; + _scaleY = scaleY; +} + void Animation::addFrame(Drawable *frame) { _frames.push_back(frame); } diff --git a/engines/draci/animation.h b/engines/draci/animation.h index 0e29934699..683af7c812 100644 --- a/engines/draci/animation.h +++ b/engines/draci/animation.h @@ -66,6 +66,8 @@ public: int getRelativeX(); int getRelativeY(); + void setScaleFactors(double scaleX, double scaleY); + void markDirtyRect(Surface *surface); private: @@ -79,6 +81,9 @@ private: int _relX; int _relY; + double _scaleX; + double _scaleY; + uint _tick; bool _playing; bool _looping; diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 2a0e5dca6f..de925fe11f 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -193,21 +193,11 @@ void Game::loop() { // We naturally want the dragon to position its feet to the location of the // click but sprites are drawn from their top-left corner so we subtract // the current height of the dragon's sprite - // We also need to do this before we change the frames' scaled dimensions - // so setRelative() can correctly delete the old frame y -= (int)(scaleY * height); anim->setRelative(x, y); - // Set the scaled dimensions for all frames - for (uint i = 0; i < anim->getFramesNum(); ++i) { - frame = anim->getFrame(i); - - // Calculate scaled dimensions - uint scaledWidth = (uint)(scaleX * frame->getWidth()); - uint scaledHeight = (uint)(scaleY * frame->getHeight()); - - frame->setScaled(scaledWidth, scaledHeight); - } + // Set the per-animation scaling factor + anim->setScaleFactors(scaleX, scaleY); // Play the animation _vm->_anims->play(animID); |