private static Dictionary <int, Tile> ReadTileset(XElement xMap, ContentManager content)
        {
            Dictionary <int, Tile> tileset = new Dictionary <int, Tile>();

            //The '0' tile is empty.
            tileset.Add(0, Tile.Empty);

            //Parse each tileset.
            foreach (var xTileset in xMap.Elements("tileset"))
            {
                //Get tileset information.
                int tileCount = XParser.ParseInt(xTileset, "tilecount");
                int firstGID  = XParser.ParseInt(xTileset, "firstgid");
                int columns   = XParser.ParseInt(xTileset, "columns");

                //Get main image.
                var       xImage = xTileset.Element("image");
                Texture2D image  = (xImage != null) ? content.Load <Texture2D>(XParser.GetString(xImage, "source")) : null;

                if (image != null)
                {
                    foreach (var xTile in xTileset.Elements("tile"))
                    {
                        int id = XParser.ParseInt(xTile, "id");

                        Tile tile = new Tile();
                        tile.Texture = image;
                        tile.Type    = ParseTileType(xTile);
                        tile.UV      = new Point(id % columns, id / columns);

                        tileset.Add(id + firstGID, tile);
                    }
                }
                else
                {
                    foreach (var xTile in xTileset.Elements("tile"))
                    {
                        int id = XParser.ParseInt(xTile, "id");

                        var       xTileImage = xTile.Element("image");
                        Texture2D tileImage  = content.Load <Texture2D>(XParser.GetString(xTileImage, "source"));

                        Tile tile = new Tile();
                        tile.Texture = tileImage;
                        tile.Type    = ParseTileType(xTile);
                        tile.UV      = Point.Zero;

                        tileset.Add(id + firstGID, tile);
                    }
                }
            }

            return(tileset);
        }
        private static void ReadProperties(GameWorld map, XElement xMap, ContentManager content)
        {
            int width  = XParser.ParseInt(xMap, "width") * Tile.Width;
            int height = XParser.ParseInt(xMap, "height") * Tile.Height;

            var properties = xMap.Element("properties");

            if (properties != null)
            {
                var musicProperty = properties.Elements().FirstOrDefault(e => XParser.GetString(e, "name") == "music");
                if (musicProperty != null)
                {
                    map.Music = content.Load <Song>(XParser.GetString(musicProperty, "value"));
                }
            }
        }
        private static GameObject BuildGameObject(XElement sourceElement, IServiceProvider services)
        {
            string     typeName = XParser.GetString(sourceElement, "type");
            GameObject gameObject;

            switch (typeName)
            {
            case "MegamanX.GameObjects.Playable.Player":
                Player player = new Player((IKeyboardDevice)services.GetService(typeof(IKeyboardDevice)));
                gameObject = player;
                break;

            case "MegamanX.GameObjects.GameObjectSpawner":
                GameObjectSpawner spawner       = new GameObjectSpawner();
                string            spawnTypeName = XParser.GetString(sourceElement, "spawntype");
                Type spawnType = Type.GetType(spawnTypeName);
                if (!typeof(GameObject).IsAssignableFrom(spawnType))
                {
                    throw new TypeLoadException($"'{spawnTypeName}' is not a valid spawnable GameObject.");
                }
                spawner.SpawnType = spawnType;
                gameObject        = spawner;
                break;

            default:
                var type = Type.GetType(typeName);
                if (!typeof(GameObject).IsAssignableFrom(type))
                {
                    throw new TypeLoadException($"'{typeName}' is not a valid GameObject.");
                }
                gameObject = (GameObject)Activator.CreateInstance(type);
                break;
            }

            float x = XParser.ParseFloat(sourceElement, "x");
            float y = XParser.ParseFloat(sourceElement, "y");

            gameObject.Position = new Vector2(x, y);

            return(gameObject);
        }