/// <summary> /// Parses Xml to populate the level with enemies, objects, etc. /// </summary> /// <param name="doc">XmlDocument containing level data.</param> /// <param name="engine">Game engine.</param> /// <returns></returns> protected void initializeLevelFromXml(XmlDocument doc, Engine engine) { // First load the tiles XmlElement ele = (XmlElement)doc.GetElementsByTagName("level")[0]; width_ = Convert.ToInt32(ele.GetAttribute("numTilesWide")); height_ = Convert.ToInt32(ele.GetAttribute("numTilesTall")); tiles_ = new int[height_, width_]; XmlNodeList tList = doc.GetElementsByTagName("tile"); for (int i = 0; i < height_; i++) { for (int j = 0; j < width_; j++) { XmlElement ele2 = (XmlElement)tList[j + i * width_]; int tempInt = Convert.ToInt32(ele2.GetAttribute("index")); tiles_[i, j] = tempInt; } } // Load the tileset similar to this XmlElement tilesetEle = (XmlElement)doc.GetElementsByTagName("tileset")[0]; if (tilesetEle == null) { tileSet_ = Tileset.getTilesetFromContent(@"XML\defaultTileset", engine); } else { tileSet_ = Tileset.getTilesetFromContent(tilesetEle.InnerText, engine); } // Now load the enemies tList = doc.GetElementsByTagName("enemy"); for (int i = 0; i < tList.Count; i++) { parseEnemy(tList[i]); } // Now load the healthBoxes, ammoBoxes, weapon pickups, and level transitions tList = doc.GetElementsByTagName("item"); for (int i = 0; i < tList.Count; i++) { parseItem(tList[i]); } tList = doc.GetElementsByTagName("overlay"); for (int i = 0; i < tList.Count; i++) { parseOverlay(tList[i]); } // Load player location from file if (doc.GetElementsByTagName("playerLocation").Count > 0) { XmlElement playerLocation = (XmlElement)doc.GetElementsByTagName("playerLocation")[0]; playerStartLocation_ = new Vector2((float)Convert.ToInt32(playerLocation.GetAttribute("x")), (float)Convert.ToInt32(playerLocation.GetAttribute("y"))); } //TODO: get from XML //player_ = new ActuatedMainPlayer(pipeline, null, new Vector2(100f, 200f), new Vector2(1.0f, 0.0f)); // player_ = null; }
/// <summary> /// Constructs a TileSet from an XmlDocument. /// </summary> /// <param name="doc">XML data containing Tileset related tags.</param> /// <param name="spriteBatch">Sprite batch which will draw the tiles.</param> /// <param name="graphics">Graphics device which will draw the tiles.</param> /// <returns>The constructed TileSet.</returns> protected static Tileset getTilesetFromXML(XmlDocument doc, SpriteBatch spriteBatch, GraphicsDevice graphics) { Tileset returnTileset = new Tileset(); XmlElement ele = (XmlElement)doc.GetElementsByTagName("image-file")[0]; string image_file = ele.InnerText; ele = (XmlElement)doc.GetElementsByTagName("tile-size")[0]; int tile_size_x = Convert.ToInt32(ele.GetAttribute("x")); int tile_size_y = Convert.ToInt32(ele.GetAttribute("y")); ele = (XmlElement)doc.GetElementsByTagName("total-tiles")[0]; int total_tiles = Convert.ToInt32(ele.InnerText); ele = (XmlElement)doc.GetElementsByTagName("tiles-high")[0]; int tiles_high = Convert.ToInt32(ele.InnerText); ele = (XmlElement)doc.GetElementsByTagName("tiles-wide")[0]; int tiles_wide = Convert.ToInt32(ele.InnerText); XmlNodeList heightsNodes = doc.GetElementsByTagName("tile-heights"); if (heightsNodes.Count != 1) { throw new Exception("Error in Tileset XML, should be exactly one tile-heights tag"); } XmlNode heightsNode = heightsNodes[0]; if (heightsNode.ChildNodes.Count != total_tiles) { throw new Exception("Number of height tags do not match total-tiles"); } for (int i = 0; i < heightsNode.ChildNodes.Count; i++) { XmlElement e = (XmlElement)heightsNode.ChildNodes[i]; bool lowH = e.GetAttribute("l").ToLower() == "true"; bool highH = e.GetAttribute("h").ToLower() == "true"; Height h = new Height(lowH, highH); returnTileset.heights_.Add(i, h); } returnTileset.TILE_SIZE_X = tile_size_x; returnTileset.TILE_SIZE_Y = tile_size_y; returnTileset.texture_ = new GameTexture(image_file, spriteBatch, graphics, calculateImageDimensions(total_tiles, tiles_wide, tiles_high, tile_size_x, tile_size_y)); return returnTileset; }