diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-11-09 17:59:14 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-11-09 17:59:14 +0300 |
commit | db1e60556c72b1b87ff2a384c556ccca724c46d6 (patch) | |
tree | 22a5f4e9c4f436ef8e746e0a2d688de80c1597a6 /src/map.cpp | |
parent | c2bb49be52a92deccec7428b6859242688fc8987 (diff) | |
parent | 1716861f0ee2f7a3714c5b44bb0f017c3d8d3b2c (diff) | |
download | plus-db1e60556c72b1b87ff2a384c556ccca724c46d6.tar.gz plus-db1e60556c72b1b87ff2a384c556ccca724c46d6.tar.bz2 plus-db1e60556c72b1b87ff2a384c556ccca724c46d6.tar.xz plus-db1e60556c72b1b87ff2a384c556ccca724c46d6.zip |
Merge branch 'master' into stable
Diffstat (limited to 'src/map.cpp')
-rw-r--r-- | src/map.cpp | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/src/map.cpp b/src/map.cpp index 564f673da..dac9fc71f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -45,6 +45,7 @@ #include "utils/dtor.h" #include "utils/mkdir.h" #include "utils/physfstools.h" +#include "utils/timer.h" #include <climits> #include <queue> @@ -172,6 +173,7 @@ Map::Map(const int width, const int height, mDrawY(-1), mDrawScrollX(-1), mDrawScrollY(-1), + mMask(1), mAtlas(nullptr), mHeights(nullptr), mRedrawMap(true), @@ -198,6 +200,7 @@ Map::Map(const int width, const int height, Map::~Map() { config.removeListeners(this); + CHECKLISTENERS // delete metadata, layers, tilesets and overlays delete [] mMetaTiles; @@ -280,11 +283,15 @@ void Map::initializeAmbientLayers() Image *const img = resman->getImage(getProperty(name + "image")); if (img) { + int mask = atoi(getProperty(name + "mask").c_str()); + if (!mask) + mask = 1; mForegrounds.push_back(new AmbientLayer(img, getFloatProperty(name + "parallax"), getFloatProperty(name + "scrollX"), getFloatProperty(name + "scrollY"), - getBoolProperty(name + "keepratio"))); + getBoolProperty(name + "keepratio"), + mask)); // The AmbientLayer takes control over the image. img->decRef(); @@ -300,11 +307,15 @@ void Map::initializeAmbientLayers() if (img) { + int mask = atoi(getProperty(name + "mask").c_str()); + if (!mask) + mask = 1; mBackgrounds.push_back(new AmbientLayer(img, getFloatProperty(name + "parallax"), getFloatProperty(name + "scrollX"), getFloatProperty(name + "scrollY"), - getBoolProperty(name + "keepratio"))); + getBoolProperty(name + "keepratio"), + mask)); // The AmbientLayer takes control over the image. img->decRef(); @@ -430,6 +441,9 @@ void Map::draw(Graphics *const graphics, int scrollX, int scrollY) layeri != layeri_end && !overFringe; ++ layeri) { MapLayer *const layer = *layeri; + if (!(layer->mMask & mMask)) + continue; + if (layer->isFringeLayer()) { layer->setSpecialLayer(mSpecialLayer); @@ -597,11 +611,21 @@ void Map::updateAmbientLayers(const float scrollX, const float scrollY) const float dy = scrollY - mLastAScrollY; const int timePassed = get_elapsed_time(lastTick); - FOR_EACH (AmbientLayerVectorCIter, i, mBackgrounds) - (*i)->update(timePassed, dx, dy); + // need check mask to update or not to update - FOR_EACH (AmbientLayerVectorCIter, i, mForegrounds) - (*i)->update(timePassed, dx, dy); + FOR_EACH (AmbientLayerVectorIter, i, mBackgrounds) + { + AmbientLayer *const layer = *i; + if (layer && (layer->mMask & mMask)) + layer->update(timePassed, dx, dy); + } + + FOR_EACH (AmbientLayerVectorIter, i, mForegrounds) + { + AmbientLayer *const layer = *i; + if (layer && (layer->mMask & mMask)) + layer->update(timePassed, dx, dy); + } mLastAScrollX = scrollX; mLastAScrollY = scrollY; @@ -637,8 +661,10 @@ void Map::drawAmbientLayers(Graphics *const graphics, const LayerType type, // Draw overlays FOR_EACHP (AmbientLayerVectorCIter, i, layers) { - if (*i) - (*i)->draw(graphics, graphics->mWidth, graphics->mHeight); + const AmbientLayer *const layer = *i; + // need check mask to draw or not to draw + if (layer && (layer->mMask & mMask)) + (layer)->draw(graphics, graphics->mWidth, graphics->mHeight); // Detail 1: only one overlay, higher: all overlays if (detail == 1) @@ -1600,3 +1626,15 @@ uint8_t Map::getHeightOffset(const int x, const int y) const return 0; return mHeights->getHeight(x, y); } + +void Map::setMask(const int mask) +{ + if (mask != mMask) + mRedrawMap = true; + mMask = mask; +} + +void Map::setMusicFile(const std::string &file) +{ + setProperty("music", file); +} |