diff options
-rw-r--r-- | src/map.cpp | 3 | ||||
-rw-r--r-- | src/resources/ambientlayer.cpp | 27 | ||||
-rw-r--r-- | src/resources/ambientlayer.h | 2 | ||||
-rw-r--r-- | src/resources/resource.h | 2 | ||||
-rw-r--r-- | src/sdlgraphics.cpp | 8 |
5 files changed, 27 insertions, 15 deletions
diff --git a/src/map.cpp b/src/map.cpp index 1de22456..368b4e2a 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -252,6 +252,7 @@ void Map::initializeAmbientLayers() ambientLayer->mSpeedX = getFloatProperty(name + "scrollX"); ambientLayer->mSpeedY = getFloatProperty(name + "scrollY"); ambientLayer->mMask = getIntProperty(name + "mask", 1); + ambientLayer->mKeepRatio = getBoolProperty(name + "keepratio"); list.push_back(ambientLayer); @@ -501,7 +502,7 @@ void Map::drawAmbientLayers(Graphics *graphics, LayerType type, if ((layer->mMask & mMask) == 0) continue; - layer->draw(graphics, graphics->getWidth(), graphics->getHeight()); + layer->draw(graphics); // Detail 1: only one overlay, higher: all overlays if (detail == 1) diff --git a/src/resources/ambientlayer.cpp b/src/resources/ambientlayer.cpp index 2fa522e5..b292070b 100644 --- a/src/resources/ambientlayer.cpp +++ b/src/resources/ambientlayer.cpp @@ -21,7 +21,6 @@ #include "resources/ambientlayer.h" #include "graphics.h" -#include "video.h" #include "resources/image.h" #include "resources/resourcemanager.h" @@ -30,8 +29,7 @@ AmbientLayer::AmbientLayer(Image *img) : mImage(img) {} -AmbientLayer::~AmbientLayer() -{} +AmbientLayer::~AmbientLayer() = default; void AmbientLayer::update(int timePassed, float dx, float dy) { @@ -58,14 +56,27 @@ void AmbientLayer::update(int timePassed, float dx, float dy) mPosY += imgH; } -void AmbientLayer::draw(Graphics *graphics, int x, int y) +void AmbientLayer::draw(Graphics *graphics) { + const auto screenWidth = graphics->getWidth(); + const auto screenHeight = graphics->getHeight(); + const auto x = static_cast<int>(mPosX); + const auto y = static_cast<int>(mPosY); + if (!mKeepRatio) + { graphics->drawImagePattern(mImage, - (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY); + -x, -y, + screenWidth + x, + screenHeight + y); + } else + { graphics->drawRescaledImagePattern(mImage, - (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY, - (int) mImage->getWidth() / defaultScreenWidth * graphics->getWidth(), - (int) mImage->getHeight() / defaultScreenHeight * graphics->getHeight()); + -x, -y, + screenWidth + x, + screenHeight + y, + mImage->getWidth() * screenWidth / 800, + mImage->getHeight() * screenHeight / 600); + } } diff --git a/src/resources/ambientlayer.h b/src/resources/ambientlayer.h index def2090b..e62af33f 100644 --- a/src/resources/ambientlayer.h +++ b/src/resources/ambientlayer.h @@ -39,7 +39,7 @@ class AmbientLayer void update(int timePassed, float dx, float dy); - void draw(Graphics *graphics, int x, int y); + void draw(Graphics *graphics); float mParallax = 0; /**< Scroll factor based on camera position. */ float mSpeedX = 0; /**< Scrolling speed in X direction. */ diff --git a/src/resources/resource.h b/src/resources/resource.h index 7f1f4836..9fe00f3d 100644 --- a/src/resources/resource.h +++ b/src/resources/resource.h @@ -59,7 +59,7 @@ class Resource { return mIdPath; } protected: - virtual ~Resource() {} + virtual ~Resource() = default; private: std::string mIdPath; /**< Path identifying this resource. */ diff --git a/src/sdlgraphics.cpp b/src/sdlgraphics.cpp index b7f80fd2..3f6e809b 100644 --- a/src/sdlgraphics.cpp +++ b/src/sdlgraphics.cpp @@ -118,23 +118,23 @@ void SDLGraphics::drawRescaledImagePattern(Image *image, if (scaledHeight <= 0 || scaledWidth <= 0) return; + SDL_Rect srcRect; + srcRect.x = image->mBounds.x; + srcRect.y = image->mBounds.y; + for (int py = 0; py < h; py += scaledHeight) // Y position on pattern plane { int dh = (py + scaledHeight >= h) ? h - py : scaledHeight; - int srcY = image->mBounds.y; int dstY = y + py + mClipStack.top().yOffset; for (int px = 0; px < w; px += scaledWidth) // X position on pattern plane { int dw = (px + scaledWidth >= w) ? w - px : scaledWidth; - int srcX = image->mBounds.x; int dstX = x + px + mClipStack.top().xOffset; SDL_Rect dstRect; - SDL_Rect srcRect; dstRect.x = dstX; dstRect.y = dstY; dstRect.w = dw; dstRect.h = dh; - srcRect.x = srcX; srcRect.y = srcY; srcRect.w = dw; srcRect.h = dh; if (SDL_RenderCopy(mRenderer, image->mTexture, &srcRect, &dstRect)) |