void XmlMapHandler::WriteLayer(wxXmlNode* root, const Map& map, const Layer& layer) { VerboseLog("Writing a Layer"); wxXmlNode* node = new wxXmlNode(root, wxXML_ELEMENT_NODE, "Layer"); wxString layerdata = "\n"; for (unsigned int i = 0; i < layer.GetHeight(); i++) { layerdata << "\t\t\t"; for (unsigned int j = 0; j < layer.GetWidth(); j++) layerdata << layer.At(j, i) << ", "; layerdata << "\n"; } wxXmlNode* data = new wxXmlNode(node, wxXML_ELEMENT_NODE, "Data"); new wxXmlNode(data, wxXML_TEXT_NODE, "", layerdata); wxXmlNode* dimensions = new wxXmlNode(node, wxXML_ELEMENT_NODE, "Dimensions"); new wxXmlNode(dimensions, wxXML_TEXT_NODE, "", wxString::Format("%i, %i", layer.GetWidth(), layer.GetHeight())); WriteAttributes(node, layer); wxXmlNode* name = new wxXmlNode(node, wxXML_ELEMENT_NODE, "Name"); new wxXmlNode(name, wxXML_TEXT_NODE, "", layer.GetName()); VerboseLog("Done Writing a Layer"); }
bool Level::Load(const std::string& filename) { Tmx::Map map; map.ParseFile(filename); if(map.HasError()) { Debug::logger->message("Error while loading level %s: %s\n", filename.c_str(), map.GetErrorText().c_str()); return false; } _width = map.GetWidth(); _height = map.GetHeight(); _tileWidth = map.GetTileWidth(); _tileHeight = map.GetTileHeight(); std::map<const Tmx::Tileset*, Tileset*> tilesetMap; for(int i = 0; i < map.GetNumTilesets(); i++) { const Tmx::Tileset* tmxTileset = map.GetTileset(i); Tileset* tileset = new Tileset(_tileWidth, _tileHeight); tileset->LoadImage(map.GetFilepath() + tmxTileset->GetImage()->GetSource()); _tilesets.push_back(tileset); tilesetMap.insert(std::pair<const Tmx::Tileset*, Tileset*>(tmxTileset, tileset)); } _collisions = new bool[_width * _height]; for(int i = 0; i < (_width * _height); i++) { _collisions[i] = false; } for(int i = 0; i < map.GetNumLayers(); i++) { const Tmx::Layer* tmxLayer = map.GetLayer(i); if(!strcasecmp(tmxLayer->GetName().c_str(), "collision")) { for(int x = 0; x < _width; x++) { for(int y = 0; y < _height; y++) { Tmx::MapTile tile = tmxLayer->GetTile(x, y); _collisions[y * _width + x] = tile.tilesetId > -1; } } continue; } else if(!strcasecmp(tmxLayer->GetName().c_str(), "middle")) { _middleLayer = i; } Layer* layer = new Layer( tmxLayer->GetWidth(), tmxLayer->GetHeight(), _tileWidth, _tileHeight); for(int x = 0; x < layer->GetWidth(); x++) { for(int y = 0; y < layer->GetHeight(); y++) { Tmx::MapTile tmxTile = tmxLayer->GetTile(x, y); MapTile tile; if(tmxTile.tilesetId != -1) { const Tmx::Tileset* tmxTileset = map.GetTileset(tmxTile.tilesetId); tile.id = tmxTile.id; tile.tileset = tilesetMap.find(tmxTileset)->second; } else { tile.id = 0; tile.tileset = NULL; } layer->SetTile(x, y, tile); } } _layers.push_back(layer); } if(_middleLayer == -1) { _middleLayer = int(floor(float(_layers.size()) / 2.0f)); // <-- nasty } for(int i = 0; i < map.GetNumObjectGroups(); i++) { const Tmx::ObjectGroup* tmxGroup = map.GetObjectGroup(i); for(int j = 0; j < tmxGroup->GetNumObjects(); j++) { const Tmx::Object* tmxObject = tmxGroup->GetObject(j); if(!strncasecmp(tmxObject->GetName().c_str(), "NPC", 3)) { NPC* npc = new NPC(this); npc->LoadSprites(tmxObject->GetProperties().GetLiteralProperty("image").c_str()); npc->SetXY(tmxObject->GetX(), tmxObject->GetY()); _npcs.push_back(npc); } else if(!strncasecmp(tmxObject->GetName().c_str(), "Warp", 4)) { Warp* warp = new Warp(); warp->SetXY(tmxObject->GetX(), tmxObject->GetY()); warp->SetWidthHeight(tmxObject->GetWidth(), tmxObject->GetHeight()); warp->SetTargetMap(tmxObject->GetProperties().GetLiteralProperty("map").c_str()); warp->SetTargetX(tmxObject->GetProperties().GetNumericProperty("x") * 32); warp->SetTargetY(tmxObject->GetProperties().GetNumericProperty("y") * 32); _warps.push_back(warp); } } } std::map<std::string, std::string> mapProps = map.GetProperties().GetList(); for(std::map<std::string, std::string>::iterator i = mapProps.begin(); i != mapProps.end(); ++i) { if(i->first == "BGM") { _bgm = musicManager.Load(i->second); } } return true; }