Removed the old map system from the editor
This commit is contained in:
@@ -1,123 +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 "region.hpp"
|
||||
|
||||
#include "utility.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <sstream>
|
||||
|
||||
Region::Region(int _x, int _y, int _w, int _h):
|
||||
x(_x),
|
||||
y(_y),
|
||||
width(_w),
|
||||
height(_h)
|
||||
{
|
||||
//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<Tile>::iterator ptr = tiles.begin();
|
||||
|
||||
//skip the tiles that are too deep
|
||||
while(ptr != tiles.end()) {
|
||||
if (ptr->depth >= minDepth) {
|
||||
break;
|
||||
}
|
||||
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;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
//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};
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -1,112 +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 REGION_HPP_
|
||||
#define REGION_HPP_
|
||||
|
||||
#include "tile.hpp"
|
||||
|
||||
#include <set>
|
||||
|
||||
/* 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;
|
||||
|
||||
//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<Tile>* 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);
|
||||
|
||||
private:
|
||||
int const x;
|
||||
int const y;
|
||||
int const width;
|
||||
int const height;
|
||||
std::set<Tile> tiles;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,121 +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 "region_pager.hpp"
|
||||
|
||||
#include "utility.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
RegionPager::RegionPager() {
|
||||
//
|
||||
}
|
||||
|
||||
RegionPager::~RegionPager() {
|
||||
if (onDelete) {
|
||||
for (auto& i : regionList) {
|
||||
onDelete(&i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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"));
|
||||
}
|
||||
}
|
||||
|
||||
regionList.push_front({x, y, regionWidth, regionHeight});
|
||||
if (onNew) {
|
||||
onNew(®ionList.front());
|
||||
}
|
||||
return ®ionList.front();
|
||||
}
|
||||
|
||||
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<Region>::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<Region>::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++;
|
||||
}
|
||||
}
|
||||
@@ -1,69 +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 REGIONPAGER_HPP_
|
||||
#define REGIONPAGER_HPP_
|
||||
|
||||
#include "region.hpp"
|
||||
#include "tile_sheet_manager.hpp"
|
||||
|
||||
#include <list>
|
||||
|
||||
class RegionPager {
|
||||
public:
|
||||
//for simplicity and consistency
|
||||
typedef void (*regionCallback_t)(Region* const);
|
||||
|
||||
RegionPager();
|
||||
~RegionPager();
|
||||
|
||||
//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);
|
||||
|
||||
//callback hooks
|
||||
void SetOnNew(regionCallback_t f) { onNew = f; }
|
||||
void SetOnDelete(regionCallback_t f) { onDelete = f; }
|
||||
|
||||
//params: Absolute values
|
||||
void Prune(int left, int top, int right, int bottom);
|
||||
|
||||
//accessors and mutators
|
||||
int SetWidth(int i) { return regionWidth = i; }
|
||||
int SetHeight(int i) { return regionHeight = i; }
|
||||
|
||||
int GetWidth() const { return regionWidth; }
|
||||
int GetHeight() const { return regionHeight; }
|
||||
|
||||
std::list<Region>* GetRegions() { return ®ionList; }
|
||||
private:
|
||||
std::list<Region> regionList;
|
||||
int regionWidth = 0, regionHeight = 0;
|
||||
|
||||
regionCallback_t onNew = nullptr;
|
||||
regionCallback_t onDelete = nullptr;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,44 +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.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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -1,50 +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 TILE_HPP_
|
||||
#define TILE_HPP_
|
||||
|
||||
//explicitly a POD
|
||||
struct Tile {
|
||||
//position relative to the Region
|
||||
int x, y, depth;
|
||||
|
||||
//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;
|
||||
}
|
||||
};
|
||||
|
||||
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
|
||||
@@ -1,59 +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.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
void TileSheet::Load(std::string fname, Uint16 w, Uint16 h) {
|
||||
//setup the image
|
||||
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;
|
||||
}
|
||||
|
||||
void TileSheet::Unload() {
|
||||
image.FreeSurface();
|
||||
totalCount = xCount = yCount = 0;
|
||||
begin = end = -1;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
image.DrawTo(dest, x, y);
|
||||
}
|
||||
@@ -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 <string>
|
||||
|
||||
/* 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
|
||||
@@ -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 <stdexcept>
|
||||
|
||||
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"));
|
||||
}
|
||||
@@ -1,51 +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 TILESHEETMANAGER_HPP_
|
||||
#define TILESHEETMANAGER_HPP_
|
||||
|
||||
#include "tile_sheet.hpp"
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
class TileSheetManager {
|
||||
public:
|
||||
TileSheetManager() = default;
|
||||
~TileSheetManager() = 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 DrawTo(SDL_Surface* const, int x, int y, int tileIndex);
|
||||
|
||||
int SetRangeEnd(int i) { return rangeEnd += i; }
|
||||
int GetRangeEnd() const { return rangeEnd; }
|
||||
|
||||
std::map<std::string, TileSheet>* GetSheetMap() { return &sheetMap; }
|
||||
private:
|
||||
std::map<std::string, TileSheet> sheetMap;
|
||||
int rangeEnd = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user