From caa3b6707e4cd6a20f2d20d57f9748b8ece89852 Mon Sep 17 00:00:00 2001 From: Robert Špalek Date: Sun, 27 Sep 2009 20:49:59 +0000 Subject: 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 --- engines/draci/animation.cpp | 101 ++++++++------------------------------------ 1 file changed, 17 insertions(+), 84 deletions(-) (limited to 'engines/draci/animation.cpp') 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::iterator it; + Common::List::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(frame)->getPixel(x, y) != transparent) { + reinterpret_cast(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; -- cgit v1.2.3