From 3c995acde81feae6c46a14fe7abbc6d2b434422b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 24 Sep 2014 03:20:25 +0200 Subject: [PATCH] Support multiple map layers, fix transparent tiles --- resources/sprite/entity/square.png | Bin 734 -> 808 bytes resources/sprite/tile/horizontal_bar.png | Bin 0 -> 118 bytes src/model/Map.cpp | 13 +++++- src/model/Map.hpp | 24 ++++++----- src/view/MapView.cpp | 49 +++++++++++++---------- 5 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 resources/sprite/tile/horizontal_bar.png diff --git a/resources/sprite/entity/square.png b/resources/sprite/entity/square.png index a386db7a8323e9883021e4de6741064bf6a44483..cdc6981bc225c3926688e64d1c612284f47b4e72 100644 GIT binary patch delta 775 zcmV+i1Ni*j1*is)83+ad007z|a3zr;7=PMHL_t(|+U=X&isCRBhF?vSl0rQc`~jun z+=6#A7dLm~H4K7aZJ~!PG&E`J9_+M?J9XD(O}C8SbCN=YHzp6CQ4@f8YDORJh4P;> z-)Ww<+bw+GM_t#b>)J}%cs#~U(>8!)~{OQVPbHe|uM>5g230vVRO= z7$S-y#BtoV=kwWW{w+A?kWym5-{bZ5^{Q{X-D0s=U^bg!KA*Ska=C=>`>3i4m&@hh z`KnM}YrM^#lw)AY;hY~|mJ z@B5fer&z642!a4X5MZ;}V7*>j&3|nLn9XKbtyVC`psFe>VT>_w&cPV_(x;Sqc%If8 zd7eWlg`y~6jJYYejr?15Wz}_!vMgbYK~WS?N+Hj4XsscHu$JEnFrUv61ObYouquG- zx}7D~M%mR`w~Jm?6{@Pb`4MNU?03Gy#0y zzgi^QJ6>WKjGG5r8^134%p&d-;9q}a_#67nBJLD`AOQ#xfFJ<~5`Z892oiuG0SFR+ zAOW6&(P;E7vq*qD={lwK9e=X^ghNaJlPt>spqIbHn=BGwK!jn4Ii;%t zaL#)<7T;9?nsGJbbQ}kqb1SE_KF@V4fRwT~0lKnmsEmMeh&b>U5)ycN9OxD7=MsSL_t(&-tC%Qs^TyhhO7B0Db!2BDkv>= z3+~3nxf|DT5Cm%rxon}KNmJ({;z*pCb26JSI)e7X%Q<|D1`r<#`^* z@h}X-FgOyY)9G|NZJOreqGEzkf95dA?jO7mG!bB<8wWt>QS=THkIr7d|$v%jI%DpZ9(5MF7T_bN)O) zyWMWP-MV1U=kw`wn$2c}5Uq7x*Uz82^Z%SUj_33Fdc985G)>bi%Ql;h7xG=eVzF4S z*Geg^wIdNBLcE0dX8Z#?IHa0S5O=n?`eUfA(7O4t#R~W8Wq|jd$Ri3xI$C5C8!IAOHdaKmY^; zfB*;x7?sIn^38#7F2Fi~`-Z^Z1;2-YrfGs8@c4JS0fK<9rYMT@`RwsPsVE8%Fd}7H zo=zu^N2+C6f`AdJs%kcyd4DV_sH*Cp3Lu2|G`(Yt2_cS0hmQfd3t)`-6<`4!`IOQqiWp;I7#b6nfU2rY!HCDgve!mJNEn8U zu_%fh1w01iF5q}P20`GrwC}m`ulc_$P2`+gyOitoTGzGT(n@QW#VR>R2q~rNy5^i; jE*HnrM0g2>K!V^0DEppT%ld%Z00000NkvXXu0mjfTaHIf diff --git a/resources/sprite/tile/horizontal_bar.png b/resources/sprite/tile/horizontal_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..08f99de1bca764ff040395b0f5dd47a38deb86d4 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND5&A- z;usQf`0WKpK?Vh$0~?y^&pRKJQ{k%8WvDA(b(3euZFUw80R{&CiL)5_8@BG+0Mx_a M>FVdQ&MBb@0J!iSkN^Mx literal 0 HcmV?d00001 diff --git a/src/model/Map.cpp b/src/model/Map.cpp index db18baf..a770ee4 100644 --- a/src/model/Map.cpp +++ b/src/model/Map.cpp @@ -35,13 +35,22 @@ std::shared_ptr Map::load(__attribute__((unused)) const std::string &name) std::shared_ptr map(new Map(16, 16)); map->tileset.push_back("dirt"); + map->tileset.push_back("horizontal_bar"); + + for (int i = 0; i < 2; i++) + map->tiles.emplace_back(new uint32_t[16*16]); for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { if (4 <= i && i < 12 && 4 <= j && j < 12) - map->setTileAt(i, j, 1); + map->setTileAt(0, i, j, 1); else - map->setTileAt(i, j, 0); + map->setTileAt(0, i, j, 0); + + if (4 <= i && i < 12 && j == 8) + map->setTileAt(1, i, j, 2); + else + map->setTileAt(1, i, j, 0); } } diff --git a/src/model/Map.hpp b/src/model/Map.hpp index 9d4eded..423c91d 100644 --- a/src/model/Map.hpp +++ b/src/model/Map.hpp @@ -44,14 +44,14 @@ private: std::vector tileset; size_t width, height; - std::unique_ptr tiles; + std::vector> tiles; std::shared_ptr playerEntity; mutable std::deque> entities; Map(size_t width0, size_t height0) - : width(width0), height(height0), tiles(new uint32_t[width*height]) { + : width(width0), height(height0) { } public: @@ -79,18 +79,22 @@ public: return height; } - void setTileAt(size_t x, size_t y, uint32_t value) { - if (x >= width || y >= height) - throw std::range_error("Map::setTileAt: bad coordinates"); - - tiles[y*width + x] = value; + size_t getLayerCount() const { + return tiles.size(); } - uint32_t getTileAt(ssize_t x, ssize_t y) const { - if (x < 0 || (size_t)x >= width || y < 0 || (size_t)y >= height) + void setTileAt(size_t layer, size_t x, size_t y, uint32_t value) { + if (layer >= tiles.size() || x >= width || y >= height) + throw std::range_error("Map::setTileAt: bad coordinates"); + + tiles[layer][y*width + x] = value; + } + + uint32_t getTileAt(size_t layer, ssize_t x, ssize_t y) const { + if (layer >= tiles.size() || x < 0 || (size_t)x >= width || y < 0 || (size_t)y >= height) return 0; - return tiles[y*width + x]; + return tiles[layer][y*width + x]; } static std::shared_ptr load(const std::string &name); diff --git a/src/view/MapView.cpp b/src/view/MapView.cpp index 4938c5d..d511c31 100644 --- a/src/view/MapView.cpp +++ b/src/view/MapView.cpp @@ -48,12 +48,11 @@ MapView::MapView(const std::shared_ptr &window0, amask = 0xff000000; #endif + SpriteCache *spriteCache = window->getSpriteCache(); + const std::vector &tileset = map->getTileset(); SDL_Surface *surface = SDL_CreateRGBSurface(0, getTileSize()*tileset.size(), getTileSize(), 32, rmask, gmask, bmask, amask); - SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - - SpriteCache *spriteCache = window->getSpriteCache(); for (size_t i = 0; i < tileset.size(); i++) { SDL_Rect rect = { @@ -63,7 +62,11 @@ MapView::MapView(const std::shared_ptr &window0, .h = 0, }; - SDL_BlitSurface(spriteCache->get("tile", tileset[i]), nullptr, surface, &rect); + SDL_Surface *sprite = spriteCache->get("tile", tileset[i]); + + SDL_SetSurfaceBlendMode(sprite, SDL_BLENDMODE_NONE); + SDL_BlitSurface(sprite, nullptr, surface, &rect); + SDL_SetSurfaceBlendMode(sprite, SDL_BLENDMODE_BLEND); } tiles = SDL_CreateTextureFromSurface(window->getRenderer(), surface); @@ -98,27 +101,29 @@ void MapView::render(float centerX, float centerY, uint64_t time) { int baseX = viewport.first/2 - int(centerX * tilePixels) - tilePixels/2, baseY = viewport.second/2 - int(centerY * tilePixels) - tilePixels/2; - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - uint32_t tile = map->getTileAt(x, y); - if (!tile) - continue; + for (size_t layer = 0; layer < map->getLayerCount(); layer++) { + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + uint32_t tile = map->getTileAt(layer, x, y); + if (!tile) + continue; - SDL_Rect src = { - .x = int(getTileSize()*(tile-1)), - .y = 0, - .w = getTileSize(), - .h = getTileSize(), - }; + SDL_Rect src = { + .x = int(getTileSize()*(tile-1)), + .y = 0, + .w = getTileSize(), + .h = getTileSize(), + }; - SDL_Rect dst = { - .x = baseX + x*tilePixels, - .y = baseY + y*tilePixels, - .w = tilePixels, - .h = tilePixels, - }; + SDL_Rect dst = { + .x = baseX + x*tilePixels, + .y = baseY + y*tilePixels, + .w = tilePixels, + .h = tilePixels, + }; - SDL_RenderCopy(window->getRenderer(), tiles, &src, &dst); + SDL_RenderCopy(window->getRenderer(), tiles, &src, &dst); + } } }