| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- #include "TMXTypes.h"
- using namespace gameplay;
- // TMXMap
- TMXMap::TMXMap()
- : _width(0), _height(0),
- _tileWidth(0.0f), _tileHeight(0.0f),
- _tileSets(), _layers()
- {
- }
- TMXMap::~TMXMap()
- {
- for (auto it = _layers.begin(); it != _layers.end(); it++)
- {
- delete *it;
- }
- }
- void TMXMap::setWidth(unsigned int value)
- {
- _width = value;
- }
- void TMXMap::setHeight(unsigned int value)
- {
- _height = value;
- }
- unsigned int TMXMap::getWidth() const
- {
- return _width;
- }
- unsigned int TMXMap::getHeight() const
- {
- return _height;
- }
- void TMXMap::setTileWidth(float value)
- {
- _tileWidth = value;
- }
- void TMXMap::setTileHeight(float value)
- {
- _tileHeight = value;
- }
- float TMXMap::getTileWidth() const
- {
- return _tileWidth;
- }
- float TMXMap::getTileHeight() const
- {
- return _tileHeight;
- }
- bool TMXMap::isValidTileId(unsigned int tileId) const
- {
- if (tileId != 0)
- {
- unsigned int tileSet = findTileSet(tileId);
- return tileSet < _tileSets.size();
- }
- return false;
- }
- unsigned int TMXMap::findTileSet(unsigned int tileId) const
- {
- if (tileId == 0)
- {
- return (unsigned int)_tileSets.size();
- }
- for (int i = (int)_tileSets.size() - 1; i >= 0; i--)
- {
- if (_tileSets[i].getFirstGid() > tileId)
- {
- continue;
- }
- return i;
- }
- return (unsigned int)_tileSets.size();
- }
- void TMXMap::addTileSet(const TMXTileSet& tileset)
- {
- _tileSets.push_back(tileset);
- }
- void TMXMap::addLayer(const TMXBaseLayer* layer)
- {
- _layers.push_back(layer);
- }
- unsigned int TMXMap::getTileSetCount() const
- {
- return (unsigned int)_tileSets.size();
- }
- unsigned int TMXMap::getLayerCount() const
- {
- return (unsigned int)_layers.size();
- }
- TMXTileSet& TMXMap::getTileSet(unsigned int index)
- {
- return _tileSets[index];
- }
- const TMXTileSet& TMXMap::getTileSet(unsigned int index) const
- {
- return _tileSets[index];
- }
- const TMXBaseLayer* TMXMap::getLayer(unsigned int index) const
- {
- return _layers[index];
- }
- // TMXTileSet
- TMXTileSet::TMXTileSet()
- : _path(""),
- _imgWidth(0), _imgHeight(0), _horzTileCount(0), _vertTileCount(0),
- _firstGid(0), _maxTileWidth(0), _maxTileHeight(0),
- _offset(), _spacing(0), _margin(0)
- {
- }
- void TMXTileSet::setImagePath(const std::string& path)
- {
- _path = path;
- }
- const std::string& TMXTileSet::getImagePath() const
- {
- return _path;
- }
- void TMXTileSet::setFirstGid(unsigned int gid)
- {
- _firstGid = gid;
- }
- unsigned int TMXTileSet::getFirstGid() const
- {
- return _firstGid;
- }
- void TMXTileSet::setMaxTileWidth(unsigned int value, bool adjustTiles)
- {
- _maxTileWidth = value;
- if (adjustTiles && _maxTileWidth != 0)
- {
- setImageWidth(_imgWidth);
- }
- }
- unsigned int TMXTileSet::getMaxTileWidth() const
- {
- return _maxTileWidth;
- }
- void TMXTileSet::setMaxTileHeight(unsigned int value, bool adjustTiles)
- {
- _maxTileHeight = value;
- if (adjustTiles && _maxTileHeight != 0)
- {
- setImageWidth(_imgHeight);
- }
- }
- unsigned int TMXTileSet::getMaxTileHeight() const
- {
- return _maxTileHeight;
- }
- void TMXTileSet::setSpacing(unsigned int value, bool adjustTiles)
- {
- _spacing = value;
- if (adjustTiles)
- {
- if (_maxTileWidth != 0)
- {
- setImageWidth(_imgWidth);
- }
- if (_maxTileHeight != 0)
- {
- setImageWidth(_imgHeight);
- }
- }
- }
- unsigned int TMXTileSet::getSpacing() const
- {
- return _spacing;
- }
- void TMXTileSet::setMargin(unsigned int value, bool adjustTiles)
- {
- _margin = value;
- if (adjustTiles)
- {
- if (_maxTileWidth != 0)
- {
- setImageWidth(_imgWidth);
- }
- if (_maxTileHeight != 0)
- {
- setImageWidth(_imgHeight);
- }
- }
- }
- unsigned int TMXTileSet::getMargin() const
- {
- return _margin;
- }
- void TMXTileSet::setImageWidth(unsigned int value)
- {
- _imgWidth = value;
- _horzTileCount = (value - (_margin * 2) + (_spacing ? _spacing : 0)) / (_maxTileWidth + _spacing);
- }
- void TMXTileSet::setImageHeight(unsigned int value)
- {
- _imgHeight = value;
- _vertTileCount = (value - (_margin * 2) + (_spacing ? _spacing : 0)) / (_maxTileHeight + _spacing);
- }
- unsigned int TMXTileSet::getHorizontalTileCount() const
- {
- return _horzTileCount;
- }
- unsigned int TMXTileSet::getVerticalTileCount() const
- {
- return _vertTileCount;
- }
- void TMXTileSet::setOffset(const Vector2& off)
- {
- _offset = off;
- }
- const Vector2& TMXTileSet::getOffset() const
- {
- return _offset;
- }
- unsigned int TMXTileSet::calculateImageDimension(unsigned int tileCount, unsigned int tileSize, unsigned int spacing, unsigned int margin)
- {
- return tileCount * (tileSize + spacing) + (margin * 2) - spacing;
- }
- Vector2 TMXTileSet::calculateTileOrigin(const Vector2& pos, const Vector2& tileSize, unsigned int spacing, unsigned int margin)
- {
- float xpos = (tileSize.x + spacing) * pos.x;
- float ypos = (tileSize.y + spacing) * pos.y;
- return Vector2(xpos + margin, ypos + margin);
- }
- // TMXBaseLayer
- TMXBaseLayer::TMXBaseLayer(TMXLayerType type)
- : _name(""), _type(type), _opacity(1.0f), _visible(true), _properties()
- {
- }
- TMXBaseLayer::~TMXBaseLayer()
- {
- }
- TMXLayerType TMXBaseLayer::getType() const
- {
- return _type;
- }
- void TMXBaseLayer::setName(const std::string& value)
- {
- _name = value;
- }
- const std::string& TMXBaseLayer::getName() const
- {
- return _name;
- }
- void TMXBaseLayer::setOpacity(float value)
- {
- _opacity = value;
- }
- float TMXBaseLayer::getOpacity() const
- {
- return _opacity;
- }
- void TMXBaseLayer::setVisible(bool value)
- {
- _visible = value;
- }
- bool TMXBaseLayer::getVisible() const
- {
- return _visible;
- }
- TMXProperties& TMXBaseLayer::getProperties()
- {
- return _properties;
- }
- const TMXProperties& TMXBaseLayer::getProperties() const
- {
- return _properties;
- }
- // TMXLayer
- #define FLIPPED_HORIZONTALLY_FLAG 0x80000000
- #define FLIPPED_VERTICALLY_FLAG 0x40000000
- #define FLIPPED_DIAGONALLY_FLAG 0x20000000
- TMXLayer::TMXLayer()
- : TMXBaseLayer(TMXLayerType::NormalLayer),
- _width(0), _height(0),
- _tiles()
- {
- }
- TMXLayer::~TMXLayer()
- {
- }
- void TMXLayer::setWidth(unsigned int value)
- {
- _width = value;
- }
- unsigned int TMXLayer::getWidth() const
- {
- return _width;
- }
- void TMXLayer::setHeight(unsigned int value)
- {
- _height = value;
- }
- unsigned int TMXLayer::getHeight() const
- {
- return _height;
- }
- void TMXLayer::setupTiles()
- {
- if (_tiles.size() != (_width * _height))
- {
- _tiles.resize(_width * _height);
- }
- }
- void TMXLayer::setTile(unsigned int x, unsigned int y, unsigned int gid)
- {
- struct layer_tile tile = {
- tile.gid = gid & ~(FLIPPED_HORIZONTALLY_FLAG |
- FLIPPED_VERTICALLY_FLAG |
- FLIPPED_DIAGONALLY_FLAG),
- tile.horz_flip = (gid & FLIPPED_HORIZONTALLY_FLAG) != 0,
- tile.vert_flip = (gid & FLIPPED_VERTICALLY_FLAG) != 0,
- tile.diag_flip = (gid & FLIPPED_DIAGONALLY_FLAG) != 0,
- };
- _tiles[x + y * _width] = tile;
- }
- const TMXLayer::layer_tile& TMXLayer::getTileStruct(unsigned int x, unsigned int y) const
- {
- return _tiles[x + y * _width];
- }
- unsigned int TMXLayer::getTile(unsigned int x, unsigned int y) const
- {
- return getTileStruct(x, y).gid;
- }
- bool TMXLayer::isEmptyTile(unsigned int x, unsigned int y) const
- {
- return getTileStruct(x, y).gid == 0;
- }
- Vector2 TMXLayer::getTileStart(unsigned int x, unsigned int y, const TMXMap& map, unsigned int resultOnlyForTileset) const
- {
- // Get the tile
- unsigned int gid = getTileStruct(x, y).gid;
- if (gid == 0)
- {
- return Vector2(-1, -1);
- }
- // Get the tileset for the tile
- unsigned int tileset_id = map.findTileSet(gid);
- if (tileset_id == map.getTileSetCount() ||
- (resultOnlyForTileset != TMX_INVALID_ID && tileset_id != resultOnlyForTileset))
- {
- return Vector2(-1, -1);
- }
- const TMXTileSet& tileset = map.getTileSet(tileset_id);
- if (tileset.getHorizontalTileCount() == 0)
- {
- return Vector2(-1, -1);
- }
- // Calculate the tile position
- unsigned int horzTileCount = tileset.getHorizontalTileCount();
- unsigned int adjusted_gid = gid - tileset.getFirstGid();
- return TMXTileSet::calculateTileOrigin(Vector2(static_cast<float>(adjusted_gid % horzTileCount), static_cast<float>(adjusted_gid / horzTileCount)),
- Vector2(static_cast<float>(tileset.getMaxTileWidth()), static_cast<float>(tileset.getMaxTileHeight())),
- tileset.getSpacing(),
- tileset.getMargin());
- }
- bool TMXLayer::hasTiles() const
- {
- size_t tile_size = _tiles.size();
- for (unsigned int i = 0; i < tile_size; i++)
- {
- if (_tiles[i].gid != 0)
- {
- return true;
- }
- }
- return false;
- }
- std::set<unsigned int> TMXLayer::getTilesetsUsed(const TMXMap& map) const
- {
- std::set<unsigned int> tilesets;
- unsigned int tileset_size = map.getTileSetCount();
- size_t tile_size = _tiles.size();
- for (unsigned int i = 0; i < tile_size; i++)
- {
- unsigned int gid = _tiles[i].gid;
- if (gid == 0)
- {
- // Empty tile
- continue;
- }
- unsigned int tileset = map.findTileSet(gid);
- if (tileset == tileset_size)
- {
- // Could not find tileset
- continue;
- }
- tilesets.insert(tileset);
- if (tilesets.size() == tileset_size)
- {
- // Don't need to continue checking, we have every possible tileset
- break;
- }
- }
- return tilesets;
- }
- // TMXImageLayer
- TMXImageLayer::TMXImageLayer()
- : TMXBaseLayer(TMXLayerType::ImageLayer),
- _pos(), _path("")
- {
- }
- TMXImageLayer::~TMXImageLayer()
- {
- }
- void TMXImageLayer::setX(int value)
- {
- _pos.x = static_cast<float>(value);
- }
- int TMXImageLayer::getX() const
- {
- return static_cast<int>(_pos.x);
- }
- void TMXImageLayer::setY(int value)
- {
- _pos.y = static_cast<float>(value);
- }
- int TMXImageLayer::getY() const
- {
- return static_cast<int>(_pos.y);
- }
- const Vector2& TMXImageLayer::getPosition() const
- {
- return _pos;
- }
- void TMXImageLayer::setImagePath(const std::string& path)
- {
- _path = path;
- }
- const std::string& TMXImageLayer::getImagePath() const
- {
- return _path;
- }
|