Exemple #1
0
        /// <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);
        }
Exemple #2
0
    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();
    }