/// <summary> /// Uses an XmlDocument to load a level and it's properties /// </summary> /// <param name="xmlDocument">XML document containing a level</param> public Level(XmlDocument xmlDocument) { GameWindow.Instance.DrawingPanel.Background = Brushes.DimGray; Objects = new List <GameObject>(); LevelCollider = new LevelCollider(); Score = new ScoreTracker(); DescriptionHeight = 0; var root = xmlDocument.DocumentElement; if (root == null) { throw new XmlException("Missing root node"); } if (!root.HasAttribute("name")) { throw new XmlException("Level missing name attribute"); } Name = root.GetAttribute("name"); if (!root.HasAttribute("background")) { Background = Brushes.DimGray; } else { Background = ResourceManager.Instance.LoadImageBrush(root.GetAttribute("background")); } var objectsXml = xmlDocument.SelectSingleNode("//level/objects"); if (objectsXml == null) { throw new XmlException("Level missing objects node"); } // Parsing objects foreach (var child in objectsXml.ChildNodes) { if (!(child is XmlNode)) { continue; } var childXml = (XmlNode)child; if (childXml.LocalName == "start") { CreateStartPoint(childXml); } if (childXml.LocalName == "end") { CreateEndPoint(childXml); } if (childXml.LocalName == "obstacle") { CreateObstacle(childXml); } } // Setting level background GameWindow.Instance.DrawingPanel.Background = Background; // Label for showing score Scorelabel = new Label(); Canvas.SetTop(Scorelabel, 10); Canvas.SetLeft(Scorelabel, 730); GameWindow.Instance.DrawingPanel.Children.Add(Scorelabel); // Checking where start location is so the player can spawn at the start location foreach (var child in objectsXml.ChildNodes) { if (!(child is XmlNode)) { continue; } var childXml = (XmlNode)child; if (childXml.LocalName == "start") { var location = ParseLocation(childXml.Attributes["location"].InnerText); Objects.Add(new Player.Player(11, ResourceManager.Instance.LoadImage("#player.png"), GameWindow.Instance.DrawingPanel, new Vector(location.X, location.Y))); } } var border = new Border { Height = 600, Width = 5, BorderThickness = new Thickness(5), BorderBrush = new SolidColorBrush(Colors.Black) }; Canvas.SetLeft(border, 782); GameWindow.Instance.DrawingPanel.Children.Add(border); }
public void Generate( ) { var levelData = OgmoLoader.levels[UnityEngine.Random.Range(0, OgmoLoader.levels.Count)]; width = levelData.width; height = levelData.height; floor = new Texture2D(width * S.SIZE, height * S.SIZE, TextureFormat.RGBA32, false); floor.filterMode = FilterMode.Point; walls = new Texture2D[height]; wallDirty = new bool[height]; for (int i = 0; i < height; i++) { walls[i] = new Texture2D(width * S.SIZE, S.SIZE, TextureFormat.RGBA32, false); walls[i].filterMode = FilterMode.Point; } var wallTex = G.I.sprites[0].texture; var floorTex = G.I.sprites[1].texture; root = new GameObject("Level Collision"); if (colliders != null) { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (colliderActive[x, y]) { colliders[x, y].Destroy(); } } } } colliders = new LevelCollider[width, height]; colliderActive = new bool[width, height]; explosionMask = new bool[width * S.SIZE, height *S.SIZE]; wallMask = new bool[width * S.SIZE, height *S.SIZE]; if (sprites != null) { foreach (var s in sprites) { G.I.DeleteSprite(s); } } sprites = new S[1 + height * WALL_HEIGHT]; var sprite = G.I.NewSprite(null, 0); sprite.renderer.sprite = Sprite.Create(floor, new Rect(0, 0, floor.width, floor.height), Vector2.zero, 1); sprite.depthOffset = -9999; sprites[0] = sprite; for (int x = 0; x < floor.width; x++) { for (int y = 0; y < floor.height; y++) { floor.SetPixel(x, y, Color.clear); setWallPixel(x, y, Color.clear); explosionMask[x, y] = false; } } for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { var tile = levelData.tiles[y * levelData.width + x]; if (tile > 0) { copyTexture(floorTex, false, (x) * S.SIZE, (y) * S.SIZE); if (tile == 2) { copyTexture(wallTex, true, (x) * S.SIZE, (y) * S.SIZE); colliderActive[x, y] = true; colliders[x, y] = new LevelCollider(x, y, root.transform); } } } //apply(); //yield return new WaitForEndOfFrame(); } entities = new Entity[levelData.entities.Length]; spawnLocations = new Vector2[4]; var spawnCount = 0; for (int i = 0; i < entities.Length; i++) { var ent = levelData.entities[i]; //Debug.Log("[Level] Spawning Entity Type: " + ent.type); Entity newEntity; switch (ent.type) { case "WeaponSpawner": newEntity = G.I.CreateEntity <WeaponSpawner>("Weapon Spawner"); (newEntity as WeaponSpawner).type = (WeaponSpawner.TYPE)System.Enum.Parse(typeof(WeaponSpawner.TYPE), ent.data["Class"].ToString()); break; case "Teleporter": newEntity = G.I.CreateEntity <Teleporter>("Teleporter"); (newEntity as Teleporter).target = int.Parse(ent.data["Target"]); break; case "PlayerSpawn": newEntity = G.I.CreateEntity <PlayerSpawn>("Player Spawn " + spawnCount); spawnLocations[spawnCount] = ent.position; spawnCount++; break; case "barrel": default: newEntity = G.I.CreateEntity <Barrel>("Barrel"); break; } newEntity.transform.position = ent.position; entities[i] = newEntity; } Update(); for (int i = 0; i < height; i++) // depth { var tex = walls[i]; for (int j = 0; j < WALL_HEIGHT; j++) // y pos { var wallSprite = G.I.NewSprite(null, 0); wallSprite.renderer.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero, 1); var brightness = (float)j / WALL_HEIGHT; wallSprite.renderer.color = new Color(brightness, brightness, brightness, 1); wallSprite.transform.Translate(0, i * S.SIZE + j, 0); wallSprite.depthOffset = j * 2; wallSprite.transform.name = "Wall " + i + ", " + j; sprites[i * WALL_HEIGHT + j + 1] = wallSprite; //yield return new WaitForEndOfFrame(); } } //yield return new WaitForEndOfFrame(); }