diff options
author | Robert Špalek | 2009-09-27 20:49:59 +0000 |
---|---|---|
committer | Robert Špalek | 2009-09-27 20:49:59 +0000 |
commit | caa3b6707e4cd6a20f2d20d57f9748b8ece89852 (patch) | |
tree | f15e38f1b9400b5af07f896e8b0a4e331cefb6a5 /engines/draci/animation.cpp | |
parent | 0a36b67a1f12490f84c1a6c1f03aa09f2e598c1f (diff) | |
download | scummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.tar.gz scummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.tar.bz2 scummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.zip |
Improved the interface of Sprite and Animation concerning relative coordinates and scaling.
It is no longer needed to modify the underlying animations when drawing them
on the screen or testing pixels in them. Read access is enough, because
the displacement of the object is passed as a parameter.
Added some more const's where they logically belong.
svn-id: r44419
Diffstat (limited to 'engines/draci/animation.cpp')
-rw-r--r-- | engines/draci/animation.cpp | 101 |
1 files changed, 17 insertions, 84 deletions
diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp index e3f87feb8b..cae4897329 100644 --- a/engines/draci/animation.cpp +++ b/engines/draci/animation.cpp @@ -33,10 +33,7 @@ Animation::Animation(DraciEngine *vm, int index) : _vm(vm) { _id = kUnused; _index = index; _z = 0; - _relX = 0; - _relY = 0; - _scaleX = 1.0; - _scaleY = 1.0; + _displacement = kNoDisplacement; _playing = false; _looping = false; _paused = false; @@ -59,8 +56,8 @@ void Animation::setRelative(int relx, int rely) { if (_frames.size() > 0) markDirtyRect(_vm->_screen->getSurface()); - _relX = relx; - _relY = rely; + _displacement.relX = relx; + _displacement.relY = rely; } void Animation::setLooping(bool looping) { @@ -72,14 +69,7 @@ void Animation::setLooping(bool looping) { void Animation::markDirtyRect(Surface *surface) const { // Fetch the current frame's rectangle Drawable *frame = _frames[_currentFrame]; - Common::Rect frameRect = frame->getRect(); - - // Translate rectangle to compensate for relative coordinates - frameRect.translate(_relX, _relY); - - // Take animation scaling into account - frameRect.setWidth((int) (frameRect.width() * _scaleX)); - frameRect.setHeight((int) (frameRect.height() * _scaleY)); + Common::Rect frameRect = frame->getRect(_displacement); // Mark the rectangle dirty on the surface surface->markDirtyRect(frameRect); @@ -135,42 +125,13 @@ void Animation::drawFrame(Surface *surface) { if (_frames.size() == 0 || !_playing) return; - Drawable *frame = _frames[_currentFrame]; + const Drawable *frame = _frames[_currentFrame]; if (_id == kOverlayImage) { frame->draw(surface, false); } else { - - int x = frame->getX(); - int y = frame->getY(); - - // Take account relative coordinates - int newX = x + _relX; - int newY = y + _relY; - - // Translate the frame to those relative coordinates - 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( - (int) (scaledWidth * _scaleX), - (int) (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); + frame->drawReScaled(surface, false, _displacement); } } @@ -191,11 +152,11 @@ uint Animation::getZ() const { } int Animation::getRelativeX() const { - return _relX; + return _displacement.relX; } int Animation::getRelativeY() const { - return _relY; + return _displacement.relY; } bool Animation::isPlaying() const { @@ -223,16 +184,16 @@ void Animation::setScaleFactors(double scaleX, double scaleY) { markDirtyRect(_vm->_screen->getSurface()); - _scaleX = scaleX; - _scaleY = scaleY; + _displacement.extraScaleX = scaleX; + _displacement.extraScaleY = scaleY; } double Animation::getScaleX() const { - return _scaleX; + return _displacement.extraScaleX; } double Animation::getScaleY() const { - return _scaleY; + return _displacement.extraScaleY; } void Animation::addFrame(Drawable *frame) { @@ -574,9 +535,9 @@ void AnimationManager::deleteAfterIndex(int index) { _lastIndex = index; } -int AnimationManager::getTopAnimationID(int x, int y) { +int AnimationManager::getTopAnimationID(int x, int y) const { - Common::List<Animation *>::iterator it; + Common::List<Animation *>::const_iterator it; // The default return value if no animations were found on these coordinates (not even overlays) // i.e. the black background shows through so treat it as an overlay @@ -594,53 +555,25 @@ int AnimationManager::getTopAnimationID(int x, int y) { continue; } - Drawable *frame = anim->getFrame(); + const Drawable *frame = anim->getFrame(); if (frame == NULL) { continue; } - int oldX = frame->getX(); - int oldY = frame->getY(); - - // Take account relative coordinates - int newX = oldX + anim->getRelativeX(); - int newY = oldY + anim->getRelativeY(); - - // Translate the frame to those relative coordinates - 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 (anim->getScaleX() != 1.0 || anim->getScaleY() != 1.0) - frame->setScaled( - (int) (scaledWidth * anim->getScaleX()), - (int) (scaledHeight * anim->getScaleY())); - - if (frame->getRect().contains(x, y)) { + if (frame->getRect(anim->getDisplacement()).contains(x, y)) { if (frame->getType() == kDrawableText) { retval = anim->getID(); } else if (frame->getType() == kDrawableSprite && - reinterpret_cast<Sprite *>(frame)->getPixel(x, y) != transparent) { + reinterpret_cast<const Sprite *>(frame)->getPixel(x, y, anim->getDisplacement()) != transparent) { retval = anim->getID(); } } - // Revert back to old coordinates - frame->setX(oldX); - frame->setY(oldY); - - // Revert back to old dimensions - frame->setScaled(scaledWidth, scaledHeight); - // Found an animation if (retval != kOverlayImage) break; |