diff --git a/common/map/tile_sheet.cpp b/common/graphics/tile_sheet.cpp similarity index 60% rename from common/map/tile_sheet.cpp rename to common/graphics/tile_sheet.cpp index 1747998..ef3153d 100644 --- a/common/map/tile_sheet.cpp +++ b/common/graphics/tile_sheet.cpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -21,39 +21,21 @@ */ #include "tile_sheet.hpp" -#include - -void TileSheet::Load(std::string fname, Uint16 w, Uint16 h) { - //setup the image +void TileSheet::Load(std::string fname, int xc, int yc) { + XCount = xc; + YCount = yc; image.LoadSurface(fname); - image.SetClipW(w); - image.SetClipH(h); - - //get the tile counts - xCount = image.GetSurface()->w / w; - yCount = image.GetSurface()->h / h; - totalCount = xCount * yCount; - - //set begin & end (usually temporary) - begin = 0; - end = totalCount; + image.SetClipW(image.GetClipW()/XCount); + image.SetClipH(image.GetClipH()/YCount); } void TileSheet::Unload() { image.FreeSurface(); - totalCount = xCount = yCount = 0; - begin = end = -1; + XCount = YCount = 0; } -void TileSheet::DrawTo(SDL_Surface* const dest, int x, int y, int tileIndex) { - if (!InRange(tileIndex)) { - throw(std::invalid_argument("Tile index out of range")); - } - Sint16 clipX = (tileIndex-begin) % xCount * image.GetClipW(); - Sint16 clipY = (tileIndex-begin) / xCount * image.GetClipH(); - - image.SetClipX(clipX); - image.SetClipY(clipY); - +void TileSheet::DrawTo(SDL_Surface* const dest, int x, int y, int tile) { + image.SetClipX(tile % XCount * image.GetClipW()); + image.SetClipY(tile / XCount * image.GetClipH()); image.DrawTo(dest, x, y); } diff --git a/common/map/tile_sheet_manager.hpp b/common/graphics/tile_sheet.hpp similarity index 56% rename from common/map/tile_sheet_manager.hpp rename to common/graphics/tile_sheet.hpp index 5e81b64..ce60989 100644 --- a/common/map/tile_sheet_manager.hpp +++ b/common/graphics/tile_sheet.hpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,33 +19,33 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef TILESHEETMANAGER_HPP_ -#define TILESHEETMANAGER_HPP_ +#ifndef TILESHEET_HPP_ +#define TILESHEET_HPP_ -#include "tile_sheet.hpp" +#include "image.hpp" -#include #include -class TileSheetManager { +class TileSheet { public: - TileSheetManager() = default; - ~TileSheetManager() = default; + TileSheet() = default; + TileSheet(std::string f, int x, int y) { Load(f, x, y); } + ~TileSheet() = default; - TileSheet* LoadSheet(std::string fname, Uint16 w, Uint16 h); - TileSheet* GetSheet(std::string name); - TileSheet* GetSheetByIndex(int tileIndex); - void UnloadSheet(std::string name); + void Load(std::string fname, int XCount, int YCount); + void Unload(); - void DrawTo(SDL_Surface* const, int x, int y, int tileIndex); + void DrawTo(SDL_Surface* const dest, int x, int y, int tile); - int SetRangeEnd(int i) { return rangeEnd += i; } - int GetRangeEnd() const { return rangeEnd; } - - std::map* GetSheetMap() { return &sheetMap; } + //accessors + Image* GetImage() { return ℑ } + int GetXCount() { return XCount; } + int GetYCount() { return YCount; } + int GetTileW() { return image.GetClipW(); } + int GetTileH() { return image.GetClipH(); } private: - std::map sheetMap; - int rangeEnd = 0; + Image image; + int XCount = 0, YCount = 0; }; #endif diff --git a/common/map/tile.cpp b/common/map/map_file_format.cpp similarity index 58% rename from common/map/tile.cpp rename to common/map/map_file_format.cpp index fcb2373..ee7f58d 100644 --- a/common/map/tile.cpp +++ b/common/map/map_file_format.cpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,26 +19,12 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#include "tile.hpp" +#include "map_file_format.hpp" -bool operator<(Tile const& lhs, Tile const& rhs) { - //sort by depth -> y -> x - if (lhs.depth == rhs.depth) { - if (lhs.y == rhs.y) { - return lhs.x < rhs.x; - } - return lhs.y < rhs.y; - } - return lhs.depth < rhs.depth; +void MapFileFormat::Load(Region** const ptr, int x, int y) { + //TODO } -inline bool operator>(Tile const& lhs, Tile const& rhs) { - //wrap the other operator - return rhs < lhs; -} - -inline bool operator==(Tile const& lhs, Tile const& rhs) { - //comparisons work on the location ONLY - //this function is redundant as far as the std::set object is concerned - return (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.depth == rhs.depth); +void MapFileFormat::Save(Region* const ptr) { + //TODO } diff --git a/common/map/tile.hpp b/common/map/map_file_format.hpp similarity index 59% rename from common/map/tile.hpp rename to common/map/map_file_format.hpp index 6e74942..546003d 100644 --- a/common/map/tile.hpp +++ b/common/map/map_file_format.hpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,32 +19,17 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef TILE_HPP_ -#define TILE_HPP_ +#ifndef MAPFILEFORMAT_HPP_ +#define MAPFILEFORMAT_HPP_ -//explicitly a POD -struct Tile { - //position relative to the Region - int x, y, depth; +#include "region.hpp" - //graphics - int width, height; - int tileIndex; - - Tile() = default; - Tile(int _x, int _y, int _depth, int _width, int _height, int _tileIndex) { - //The order of the arguments should be explicit - x = _x; - y = _y; - depth = _depth; - width = _width; - height = _height; - tileIndex = _tileIndex; - } +class MapFileFormat { +public: + void Load(Region** const, int x, int y); + void Save(Region* const); +private: + // }; -bool operator<(Tile const& lhs, Tile const& rhs); -bool operator>(Tile const& lhs, Tile const& rhs); -bool operator==(Tile const& lhs, Tile const& rhs); - #endif diff --git a/common/map/map_generator.cpp b/common/map/map_generator.cpp new file mode 100644 index 0000000..2668ca5 --- /dev/null +++ b/common/map/map_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "map_generator.hpp" + +void MapGenerator::Create(Region** const ptr, int width, int height, int depth, int x, int y) { + (*ptr) = new Region(width, height, depth, x, y); +} + +void MapGenerator::Unload(Region* const ptr) { + delete ptr; +} diff --git a/common/map/map_generator.hpp b/common/map/map_generator.hpp new file mode 100644 index 0000000..85121b9 --- /dev/null +++ b/common/map/map_generator.hpp @@ -0,0 +1,35 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef MAPGENERATOR_HPP_ +#define MAPGENERATOR_HPP_ + +#include "region.hpp" + +class MapGenerator { +public: + void Create(Region** const, int width, int height, int depth, int x, int y); + void Unload(Region* const); +private: + // +}; + +#endif diff --git a/common/map/region.cpp b/common/map/region.cpp index 190f310..9f4f68e 100644 --- a/common/map/region.cpp +++ b/common/map/region.cpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -21,103 +21,39 @@ */ #include "region.hpp" -#include "utility.hpp" - -#include -#include - -Region::Region(int _x, int _y, int _w, int _h): - x(_x), - y(_y), - width(_w), - height(_h) +Region::Region(int argWidth, int argHeight, int argDepth, int argX, int argY): + width(argWidth), + height(argHeight), + depth(argDepth), + x(argX), + y(argY) { - //make sure that the region's position lines up - if (x != snapToBase(width, x) || y != snapToBase(height, y)) { - std::ostringstream os; - os << "Region is unaligned; x: " << x << ", y: " << y << ", width: " << width << ", height: " << height; - throw(std::runtime_error(os.str())); - } -} - -int Region::NewTileR(Tile const& tile) { - //return 1 for overwrite, 0 for insert - if (!InBoundsR(tile.x, tile.y)) { - std::ostringstream os; - os << "New tile location out of bounds: " << - "(" << x << "," << y << ")->" << - "(" << tile.x << "," << tile.y << ")" - ; - throw(std::runtime_error(os.str())); - } - - int ret = tiles.erase(tile); - tiles.insert(tile); - return ret; -} - -Tile Region::GetTileR(int tx, int ty, int minDepth) { - std::set::iterator ptr = tiles.begin(); - - //skip the tiles that are too deep - while(ptr != tiles.end()) { - if (ptr->depth >= minDepth) { - break; + tiles = new int**[width]; + for (int i = 0; i < width; ++i) { + tiles[i] = new int*[height]; + for (int j = 0; j < height; ++j) { + tiles[i][j] = new int[depth]; + for (int k = 0; k < depth; ++k) { + tiles[i][j][k] = 0; + } } - ptr++; } +} - //find the first tile here - while(ptr != tiles.end()) { - //bounds - if ((ptr->x <= tx) && (ptr->y <= ty) && (ptr->x + ptr->width > tx) && (ptr->y + ptr->height > ty)) { - break; +Region::~Region() { + for (int i = 0; i < width; ++i) { + for (int j = 0; j < height; j++) { + delete tiles[i][j]; } - ptr++; + delete tiles[i]; } - - //found it - if (ptr != tiles.end()) { - return *ptr; - } - - //a tileIndex of -1 is an error code, the rest is for show - return {0,0,0,-1,-1,-1}; + delete tiles; } -int Region::DeleteTileR(Tile const& tile) { - if (!InBoundsR(tile.x, tile.y)) { - throw(std::runtime_error("Deleted tile location out of bounds")); - - std::ostringstream os; - os << "Deleted tile location out of bounds: " << - "(" << x << "," << y << ")->" << - "(" << tile.x << "," << tile.y << ")" - ; - throw(std::runtime_error(os.str())); - } - //sentinel/error code - if (tile.tileIndex == -1) { - return 0; - } - return tiles.erase(tile); +int Region::SetTile(int x, int y, int z, int v) { + return tiles[x][y][z] = v; } -bool operator<(Region const& lhs, Region const& rhs) { - //sort by y -> x - if (lhs.y == rhs.y) { - return lhs.x < rhs.x; - } - return lhs.y < rhs.y; -} - -inline bool operator>(Region const& lhs, Region const& rhs) { - //wrap the other operator - return rhs < lhs; -} - -inline bool operator==(Region const& lhs, Region const& rhs) { - //comparisons work on the location ONLY - //this function is redundant as far as the std::set object is concerned - return (lhs.x == rhs.x) && (lhs.y == rhs.y); +int Region::GetTile(int x, int y, int z) { + return tiles[x][y][z]; } diff --git a/common/map/region.hpp b/common/map/region.hpp index eac450f..4d083ad 100644 --- a/common/map/region.hpp +++ b/common/map/region.hpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -22,91 +22,29 @@ #ifndef REGION_HPP_ #define REGION_HPP_ -#include "tile.hpp" - -#include - -/* A single section of the map. - * This class stores the tiles relative to it's own position, but - * there are functions for referencing the tiles' absolute position. - * These functions simply wrap the normal functions. -*/ class Region { public: Region() = delete; - Region(int x, int y, int width, int height); - ~Region() = default; + Region(int width, int height, int depth, int x, int y); + ~Region(); - //create and insert a new tile, overwriting an existing tile at that location - int NewTileR(Tile const& tile); - int NewTileA(Tile const& tile) { - //these can change, if the Tile class is changed - return NewTileR({ - tile.x - x, - tile.y - y, - tile.depth, - tile.width, - tile.height, - tile.tileIndex - }); - } - - //find the first tile at this location, with the specified minimum depth - Tile GetTileR(int tx, int ty, int minDepth); - Tile GetTileA(int tx, int ty, int minDepth) { - return GetTileR(tx - x, ty - y, minDepth); - } - - //wrap the other delete functions - int DeleteTileR(int tx, int ty, int minDepth) { - return DeleteTileR(GetTileR(tx, ty, minDepth)); - } - int DeleteTileA(int tx, int ty, int minDepth) { - //explicitly skip one function call by adjusting from A to R - return DeleteTileR(GetTileR(tx - x, ty - y, minDepth)); - } - - //delete the specified tile - int DeleteTileR(Tile const& tile); - int DeleteTileA(Tile const& tile) { - //these can change, if the Tile class is changed - return DeleteTileR({ - tile.x - x, - tile.y - y, - tile.depth, - tile.width, - tile.height, - tile.tileIndex - }); - } - - //find if the specified location exists within the region's bounds - bool InBoundsR(int i, int j) { - return (i >= 0) && (j >= 0) && (i < width) && (j < height); - } - bool InBoundsA(int i, int j) { - return InBoundsR(i - x, j - y); - } - - //Raw accessors & mutators - int GetX() const { return x; } - int GetY() const { return y; } - int GetWidth() const { return width; } - int GetHeight() const { return height; } - - std::set* GetTiles() { return &tiles; } - - //sorting the regions by the locations - friend bool operator<(Region const& lhs, Region const& rhs); - friend bool operator>(Region const& lhs, Region const& rhs); - friend bool operator==(Region const& lhs, Region const& rhs); + int SetTile(int x, int y, int z, int v); + int GetTile(int x, int y, int z); + //accessors + int GetWidth() { return width; } + int GetHeight() { return height; } + int GetDepth() { return depth; } + int GetX() { return x; } + int GetY() { return y; } private: - int const x; - int const y; - int const width; - int const height; - std::set tiles; + const int width; + const int height; + const int depth; + const int x; + const int y; + + int*** tiles = nullptr; }; #endif diff --git a/common/map/region_pager.cpp b/common/map/region_pager.cpp index 7e6ed7b..a251ee8 100644 --- a/common/map/region_pager.cpp +++ b/common/map/region_pager.cpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -23,99 +23,46 @@ #include "utility.hpp" -#include -#include - -RegionPager::RegionPager() { - // +RegionPagerBase::RegionPagerBase(int argWidth, int argHeight, int argDepth): + regionWidth(argWidth), + regionHeight(argHeight), + regionDepth(argDepth) +{ + //EMPTY } -RegionPager::~RegionPager() { - if (onDelete) { - for (auto& i : regionList) { - onDelete(&i); - } - } +RegionPagerBase::~RegionPagerBase() { + //EMPTY } -Region* RegionPager::NewRegion(int x, int y) { - for (auto& i : regionList) { - if (i.GetX() == x && i.GetY() == y) { - throw(std::runtime_error("Duplicate Regions detected")); +int RegionPagerBase::SetTile(int x, int y, int z, int v) { + Region* ptr = GetRegion(x, y); + return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v); +} + +int RegionPagerBase::GetTile(int x, int y, int z) { + Region* ptr = GetRegion(x, y); + return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z); +} + +Region* RegionPagerBase::GetRegion(int x, int y) { + //snap the coords + x = snapToBase(regionWidth, x); + y = snapToBase(regionHeight, y); + + //find the region + for (std::list::iterator it = regionList.begin(); it != regionList.end(); it++) { + if ((*it)->GetX() == x && (*it)->GetY() == y) { + return *it; } } - regionList.push_front({x, y, regionWidth, regionHeight}); - if (onNew) { - onNew(®ionList.front()); - } - return ®ionList.front(); + //get the region by other means + Region* ptr = LoadRegion(x, y); + if (ptr) return ptr; + return CreateRegion(x, y); } -Region* RegionPager::GetRegion(int x, int y) { - for (auto& i : regionList) { - if (i.GetX() == x && i.GetY() == y) { - return &i; - } - } - //create, insert and return - regionList.push_front({x, y, regionWidth, regionHeight}); - if (onNew) { - onNew(®ionList.front()); - } - return ®ionList.front(); -} - -void RegionPager::DeleteRegion(int x, int y) { - for (std::list::iterator i = regionList.begin(); i != regionList.end(); i++) { - if (i->GetX() == x && i->GetY() == y) { - if (onDelete) { - onDelete(&(*i)); - } - regionList.erase(i); - break; - } - } -} - -void RegionPager::DrawTo(SDL_Surface* const dest, TileSheetManager* const sheetMgr, int camX, int camY) { - for (auto& regionIter : regionList) { - -#ifdef DEBUG - //draw the region's location - SDL_Rect box = { - Sint16(regionIter.GetX() - camX), - Sint16(regionIter.GetY() - camY), - Uint16(regionIter.GetWidth()), - Uint16(regionIter.GetHeight()) - }; - SDL_FillRect(dest, &box, SDL_MapRGB(dest->format, 10, 10, 20)); -#endif - - //draw each tile - for (auto& tileIter : *regionIter.GetTiles()) { - sheetMgr->DrawTo( - dest, - tileIter.x + regionIter.GetX() - camX, - tileIter.y + regionIter.GetY() - camY, - tileIter.tileIndex - ); - } - } -} - -void RegionPager::Prune(int left, int top, int right, int bottom) { - std::list::iterator it = regionList.begin(); - - while(it != regionList.end()) { - if (it->GetX() >= right || it->GetY() >= bottom || it->GetX() + it->GetWidth() < left || it->GetY() + it->GetHeight() < top) { - if (onDelete) { - onDelete(&(*it)); - } - regionList.erase(it); - it = regionList.begin(); - continue; - } - it++; - } +void RegionPagerBase::Update() { + //TODO } diff --git a/common/map/region_pager.hpp b/common/map/region_pager.hpp index 54cba33..30c6f64 100644 --- a/common/map/region_pager.hpp +++ b/common/map/region_pager.hpp @@ -1,4 +1,4 @@ -/* Copyright: (c) Kayne Ruse 2013 +/* Copyright: (c) Kayne Ruse 2014 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -23,47 +23,117 @@ #define REGIONPAGER_HPP_ #include "region.hpp" -#include "tile_sheet_manager.hpp" +#include "utility.hpp" #include -class RegionPager { +class RegionPagerBase { public: - //for simplicity and consistency - typedef void (*regionCallback_t)(Region* const); + RegionPagerBase() = delete; + RegionPagerBase(int regionWidth, int regionHeight, int regionDepth); + virtual ~RegionPagerBase(); - RegionPager(); - ~RegionPager(); + int SetTile(int x, int y, int z, int v); + int GetTile(int x, int y, int z); + + void Update(); - //these parameters MUST be multiples of the width & height - Region* NewRegion(int x, int y); Region* GetRegion(int x, int y); - void DeleteRegion(int x, int y); - //call this to draw to the screen - void DrawTo(SDL_Surface* const, TileSheetManager* const, int camX, int camY); + //interface + virtual Region* LoadRegion(int x, int y) = 0; + virtual Region* SaveRegion(int x, int y) = 0; + virtual Region* CreateRegion(int x, int y) = 0; + virtual void UnloadRegion(int x, int y) = 0; - //callback hooks - void SetOnNew(regionCallback_t f) { onNew = f; } - void SetOnDelete(regionCallback_t f) { onDelete = f; } + //accessors + int GetRegionWidth() { return regionWidth; } + int GetRegionHeight() { return regionHeight; } + int GetRegionDepth() { return regionDepth; } +protected: + const int regionWidth; + const int regionHeight; + const int regionDepth; + std::list regionList; +}; - //params: Absolute values - void Prune(int left, int top, int right, int bottom); +template +class RegionPager : public RegionPagerBase { +public: + RegionPager() = delete; + RegionPager(int w, int h, int d): + RegionPagerBase(w, h, d) + { + //EMPTY + } + ~RegionPager() = default; - //accessors and mutators - int SetWidth(int i) { return regionWidth = i; } - int SetHeight(int i) { return regionHeight = i; } + Region* LoadRegion(int x, int y) { + //snap the coords + x = snapToBase(regionWidth, x); + y = snapToBase(regionHeight, y); - int GetWidth() const { return regionWidth; } - int GetHeight() const { return regionHeight; } + //load the region if possible + Region* ptr = nullptr; + format.Load(&ptr, x, y); + if (ptr) { + regionList.push_back(ptr); + return ptr; + } + return nullptr; + } - std::list* GetRegions() { return ®ionList; } -private: - std::list regionList; - int regionWidth = 0, regionHeight = 0; + Region* SaveRegion(int x, int y) { + //snap the coords + x = snapToBase(regionWidth, x); + y = snapToBase(regionHeight, y); - regionCallback_t onNew = nullptr; - regionCallback_t onDelete = nullptr; + //find & save the region + for (std::list::iterator it = regionList.begin(); it != regionList.end(); it++) { + if ((*it)->GetX() == x && (*it)->GetY() == y) { + format.Save(*it); + return *it; + } + } + return nullptr; + } + + Region* CreateRegion(int x, int y) { + //snap the coords + x = snapToBase(regionWidth, x); + y = snapToBase(regionHeight, y); + + //create and push the object + Region* ptr = nullptr; + generator.Create(&ptr, regionWidth, regionHeight, regionDepth, x, y); + regionList.push_back(ptr); + return ptr; + } + + void UnloadRegion(int x, int y) { + //snap the coords + x = snapToBase(regionWidth, x); + y = snapToBase(regionHeight, y); + + for (std::list::iterator it = regionList.begin(); it != regionList.end(); /* EMPTY */) { + if ((*it)->GetX() == x && (*it)->GetY() == y) { + generator.Unload(*it); + regionList.erase(it); + + //reset the loop, because of reasons + it = regionList.begin(); + continue; + } + ++it; + } + } + + //accessors + MapGenerator* GetGenerator() { return &generator; } + MapFileFormat* GetFormat() { return &format; } +protected: + MapGenerator generator; + MapFileFormat format; }; #endif diff --git a/common/map/tile_sheet.hpp b/common/map/tile_sheet.hpp deleted file mode 100644 index c127407..0000000 --- a/common/map/tile_sheet.hpp +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright: (c) Kayne Ruse 2013 - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. -*/ -#ifndef TILESHEET_HPP_ -#define TILESHEET_HPP_ - -#include "image.hpp" - -#include - -/* The TileSheet class is used for drawing tiles of the map to the screen. - * This class also tracks the range of the tile images. -*/ -class TileSheet { -public: - TileSheet() = default; - ~TileSheet() = default; - - //these load/set functions need to be followed by bookkeeping code - //w & h are the width & height of individual tiles - //TODO: rename these - void Load(std::string fname, Uint16 w, Uint16 h); - void Unload(); - - void DrawTo(SDL_Surface* const dest, int x, int y, int tileIndex); - - bool InRange(int i) { return i >= begin && i < end; } - - //accessors and mutators - Image* GetImage() { return ℑ } - - int GetTileW() const { return image.GetClipW(); } - int GetTileH() const { return image.GetClipH(); } - - int GetTotalCount() const { return totalCount; } - int GetXCount() const { return xCount; } - int GetYCount() const { return yCount; } - - int SetBegin(int i) { return begin = i; } - int SetEnd(int i) { return end = i; } - - int GetBegin() const { return begin; } - int GetEnd() const { return end; } -private: - Image image; - - //these are generated and used by internal processes - int totalCount = 0, xCount = 0, yCount = 0; - int begin = -1, end = -1; -}; - -#endif diff --git a/common/map/tile_sheet_manager.cpp b/common/map/tile_sheet_manager.cpp deleted file mode 100644 index 531f8c4..0000000 --- a/common/map/tile_sheet_manager.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright: (c) Kayne Ruse 2013 - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. -*/ -#include "tile_sheet_manager.hpp" - -#include "utility.hpp" - -#include - -TileSheet* TileSheetManager::LoadSheet(std::string fname, Uint16 w, Uint16 h) { - //get the key - std::string key = truncatePath(fname); - - //don't override what's already here - if (sheetMap.find(key) != sheetMap.end()) { - throw(std::runtime_error("Cannot load duplicate tile sheets")); - } - - //load & setup the sheet object - sheetMap[key].Load(fname, w, h); - sheetMap[key].SetBegin(rangeEnd); - rangeEnd += sheetMap[key].GetTotalCount(); - sheetMap[key].SetEnd(rangeEnd); - - //you can modify the object, say, during the save & load routines... - return &sheetMap[key]; -} - -TileSheet* TileSheetManager::GetSheet(std::string name) { - return &sheetMap.at(name); -} - -TileSheet* TileSheetManager::GetSheetByIndex(int tileIndex) { - for (auto& it : sheetMap) { - if (it.second.InRange(tileIndex)) { - return &it.second; - } - } - return nullptr; -} - -void TileSheetManager::UnloadSheet(std::string name) { - sheetMap.erase(name); -} - -void TileSheetManager::DrawTo(SDL_Surface* const dest, int x, int y, int tileIndex) { - for (auto& it : sheetMap) { - if (it.second.InRange(tileIndex)) { - it.second.DrawTo(dest, x, y, tileIndex); - return; - } - } - //No matching tile index - throw(std::invalid_argument("Tile index is out of range of all tile sheets")); -} diff --git a/common/utility.cpp b/common/utility.cpp index 4ba5fc1..38c79ef 100644 --- a/common/utility.cpp +++ b/common/utility.cpp @@ -27,9 +27,9 @@ int snapToBase(int base, int x) { //snap to a grid if (x < 0) { x++; - return x - x % base - base; + return x / base * base - base; } - return x - x % base; + return x / base * base; } std::string truncatePath(std::string pathname) { diff --git a/editor/editor_scene.cpp b/editor/editor_scene.cpp index 2d15e55..2709419 100644 --- a/editor/editor_scene.cpp +++ b/editor/editor_scene.cpp @@ -34,7 +34,8 @@ using namespace std; //------------------------- EditorScene::EditorScene(ConfigUtility* const arg1): - config(*arg1) + config(*arg1), + pager(20, 20, 3) { //create the debugging "window" debugInfo.CreateSurface(256, 256); @@ -50,25 +51,13 @@ EditorScene::EditorScene(ConfigUtility* const arg1): menuBar.SetImage(&buttonImage); menuBar.SetEntries({ - {"File", "-New", "-Open", "-Save", "-Save As...", "-Close", "Exit"}, - {"Edit", "-Set Tile", "-Load Sheet", "-Delete Sheet", "-Metadata", "-Run Script"}, + {"File", "New", "Open", "Save", "Save As...", "Close", "Exit"}, + {"Edit", "Set Tile", "Load Sheet", "Delete Sheet", "Metadata", "Run Script"}, {"Debugging", "Debug On", "Debug Off", "Toggle Debug", "Testificate"} }); - //setup the pager - pager.SetOnNew([](Region* const ptr){ - printf("New Region: %d, %d\n", ptr->GetX(), ptr->GetY()); - }); - - pager.SetOnDelete([](Region* const ptr){ - printf("Delete Region: %d, %d\n", ptr->GetX(), ptr->GetY()); - }); - - //Set a resonable size for the regions - pager.SetWidth(32*4); - pager.SetHeight(32*4); - - sheetMgr.LoadSheet(config["dir.tilesets"] + "terrain.bmp", 32, 32); + //debug + tsheet.Load("rsc\\graphics\\tilesets\\sand.bmp", 12, 3); } EditorScene::~EditorScene() { @@ -84,7 +73,7 @@ void EditorScene::FrameStart() { } void EditorScene::Update(double delta) { - pager.Prune(camera.x, camera.y, camera.x + GetScreen()->w, camera.y + GetScreen()->h); + // } void EditorScene::FrameEnd() { @@ -92,8 +81,19 @@ void EditorScene::FrameEnd() { } void EditorScene::Render(SDL_Surface* const screen) { - //draw the map - pager.DrawTo(screen, &sheetMgr, camera.x, camera.y); + //debug + for (int i = 0; i < pager.GetRegionWidth()*2; i++) { + for (int j = 0; j < pager.GetRegionHeight()*2; j++) { + for (int k = 0; k < pager.GetRegionDepth(); k++) { + tsheet.DrawTo( + screen, + i*tsheet.GetTileW()-camera.x, + j*tsheet.GetTileH()-camera.y, + pager.GetTile(i,j,k) + ); + } + } + } //draw a big bar across the top buttonImage.SetClipY(0); @@ -130,24 +130,6 @@ void EditorScene::DrawToDebugInfo(std::string str, int line) { void EditorScene::MouseMotion(SDL_MouseMotionEvent const& motion) { menuBar.MouseMotion(motion); - if (motion.state & SDL_BUTTON_LMASK && motion.y >= buttonImage.GetClipH()) { - Region* regionPtr = pager.GetRegion( - snapToBase(pager.GetWidth(), motion.x + camera.x), - snapToBase(pager.GetHeight(), motion.y + camera.y) - ); - - TileSheet* sheetPtr = sheetMgr.GetSheetByIndex(tileCounter); - - regionPtr->NewTileA({ - snapToBase(sheetPtr->GetTileW(), motion.x + camera.x), //x - snapToBase(sheetPtr->GetTileH(), motion.y + camera.y), //y - 0, //depth - sheetPtr->GetTileW(), //width - sheetPtr->GetTileH(), //height - tileCounter++ //value - }); - } - if (motion.state & SDL_BUTTON_RMASK) { camera.x -= motion.xrel; camera.y -= motion.yrel; @@ -156,24 +138,6 @@ void EditorScene::MouseMotion(SDL_MouseMotionEvent const& motion) { void EditorScene::MouseButtonDown(SDL_MouseButtonEvent const& button) { menuBar.MouseButtonDown(button); - - if (button.button == SDL_BUTTON_LEFT && button.y >= buttonImage.GetClipH()) { - Region* regionPtr = pager.GetRegion( - snapToBase(pager.GetWidth(), button.x + camera.x), - snapToBase(pager.GetHeight(), button.y + camera.y) - ); - - TileSheet* sheetPtr = sheetMgr.GetSheetByIndex(tileCounter); - - regionPtr->NewTileA({ - snapToBase(sheetPtr->GetTileW(), button.x + camera.x), //x - snapToBase(sheetPtr->GetTileH(), button.y + camera.y), //y - 0, //depth - sheetPtr->GetTileW(), //width - sheetPtr->GetTileH(), //height - tileCounter++ //value - }); - } } void EditorScene::MouseButtonUp(SDL_MouseButtonEvent const& button) { @@ -205,7 +169,7 @@ void EditorScene::MouseButtonUp(SDL_MouseButtonEvent const& button) { break; case 5: { - //Quit + //EXIT SDL_Event e; e.type = SDL_QUIT; SDL_PushEvent(&e); diff --git a/editor/editor_scene.hpp b/editor/editor_scene.hpp index 1cc872f..d8052bd 100644 --- a/editor/editor_scene.hpp +++ b/editor/editor_scene.hpp @@ -24,15 +24,15 @@ #include "base_scene.hpp" -#include "region_pager.hpp" -#include "tile_sheet_manager.hpp" - #include "config_utility.hpp" #include "image.hpp" #include "raster_font.hpp" #include "menu_bar.hpp" -//#include "map_loader.hpp" +#include "region_pager.hpp" +#include "map_generator.hpp" +#include "map_file_format.hpp" +#include "tile_sheet.hpp" class EditorScene : public BaseScene { public: @@ -62,19 +62,16 @@ protected: Image debugInfo; bool debugOpen = true; - RegionPager pager; - TileSheetManager sheetMgr; - RasterFont font; Image buttonImage; - MenuBar menuBar; struct { int x = 0, y = 0; } camera; - int tileCounter = 0; + RegionPager pager; + TileSheet tsheet; }; #endif diff --git a/editor/main.cpp b/editor/main.cpp index c244c1e..3348ec0 100644 --- a/editor/main.cpp +++ b/editor/main.cpp @@ -39,4 +39,4 @@ int main(int, char**) { } cout << "Clean exit" << endl; return 0; -} +} \ No newline at end of file diff --git a/editor/testificate_scene.cpp b/editor/testificate_scene.cpp index 3baf500..9f451f2 100644 --- a/editor/testificate_scene.cpp +++ b/editor/testificate_scene.cpp @@ -33,18 +33,7 @@ using std::endl; TestificateScene::TestificateScene(ConfigUtility* const arg1): config(*arg1) { - sheetMgr.LoadSheet(config["dir.tilesets"] + "grass.bmp", 32, 32); - sheetMgr.LoadSheet(config["dir.tilesets"] + "longgrass.bmp", 32, 32); - sheetMgr.LoadSheet(config["dir.tilesets"] + "sand.bmp", 32, 32); - sheetMgr.LoadSheet(config["dir.tilesets"] + "dirt.bmp", 32, 32); - sheetMgr.LoadSheet(config["dir.tilesets"] + "water.bmp", 32, 32); - - cout << "Range End: " << sheetMgr.GetRangeEnd() << endl; - - pager.SetWidth(128); - pager.SetHeight(128); - - pager.GetRegion(0, 0)->NewTileR({0, 0, 0, 32, 32, 0}); + // } TestificateScene::~TestificateScene() { @@ -68,12 +57,7 @@ void TestificateScene::FrameEnd() { } void TestificateScene::Render(SDL_Surface* const screen) { - //dump all tile graphics to the screen - for (int i = 0; i < sheetMgr.GetRangeEnd(); i++) { - sheetMgr.DrawTo(screen, i * 32 % screen->w, i * 32 / screen->w * 32, i); - } - -// pager.DrawTo(screen, &sheetMgr, 0, 0); + // } //------------------------- diff --git a/editor/testificate_scene.hpp b/editor/testificate_scene.hpp index 069fca0..dd0a76b 100644 --- a/editor/testificate_scene.hpp +++ b/editor/testificate_scene.hpp @@ -25,8 +25,6 @@ #include "base_scene.hpp" #include "config_utility.hpp" -#include "tile_Sheet_manager.hpp" -#include "region_pager.hpp" class TestificateScene : public BaseScene { public: @@ -50,10 +48,6 @@ protected: //globals ConfigUtility& config; - - //members - TileSheetManager sheetMgr; - RegionPager pager; }; #endif