コード例 #1
0
    public static Sprite GetTextureForLevel(Declarations.LevelData levelData)
    {
        int    HexHeight     = 10;
        var    width         = (int)HexToPoints(HexHeight, 1, levelData.MapSize.x - 1)[4].X;
        var    height        = (int)HexToPoints(HexHeight, levelData.MapSize.y - 1, 0)[0].Y;
        var    pointForHexes = FillPointForHexes(levelData, HexHeight);
        Bitmap myBitmap      = new Bitmap(width, height);
        var    graphics      = System.Drawing.Graphics.FromImage(myBitmap);

        graphics.Clear(System.Drawing.Color.Transparent);
        DrawHexGrid(graphics, pointForHexes, levelData);

        Texture2D texture = new Texture2D(width, height);

        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                var pixel = myBitmap.GetPixel(i, height - j - 1);
                texture.SetPixel(i, j, new UnityEngine.Color((float)pixel.R / 255, (float)pixel.G / 255, (float)pixel.B / 255, (float)pixel.A / 255));
            }
        }
        texture.Apply();
        return(Sprite.Create(texture, new Rect(0, 0, width, height), Vector2.zero));
    }
コード例 #2
0
    public static bool ReadLevelData(XElement levelFile, out Declarations.LevelData levelData, bool canHaveEmptyTiles = false, bool readWaves = true)
    {
        var mapElement = levelFile.Element(Constants.cst_Map);
        var spawnData  = levelFile.Element(Constants.cst_SpawnData);

        if (mapElement != null && spawnData != null)
        {
            int    startMoney;
            int    startHealth;
            string name;
            Declarations.IntVector2 mapSize;
            Declarations.TileType[,] map;
            List <Declarations.WaveData> waves;
            if (levelFile.Attribute(Constants.cst_StartMoney) != null && int.TryParse(levelFile.Attribute(Constants.cst_StartMoney).Value, out startMoney) &&
                levelFile.Attribute(Constants.cst_StartHealth) != null && int.TryParse(levelFile.Attribute(Constants.cst_StartHealth).Value, out startHealth) &&
                levelFile.Attribute(Constants.cst_Name) != null &&
                ReadMapData(mapElement, out mapSize, out map, canHaveEmptyTiles))
            {
                name  = levelFile.Attribute(Constants.cst_Name).Value;
                waves = null;
                if (!readWaves || ReadWaveData(spawnData, out waves))
                {
                    levelData = new Declarations.LevelData(name, mapSize, map, waves, startMoney, startHealth);
                    return(true);
                }
            }
        }
        levelData = null;
        return(false);
    }
コード例 #3
0
 public void SetData(Declarations.LevelData data)
 {
     NameText.text = data.Name;
     for (int i = 0; i < 3; i++)
     {
         if (i + 1 <= data.Stars)
         {
             Stars[i].sprite = FullStar;
         }
         else
         {
             Stars[i].sprite = EmptyStar;
         }
     }
     Preview.sprite = data.previewSprite;
     if (data.Unlocked || GameManager.instance.DeveloperMode)
     {
         Outline.effectColor = Color.green;
         Button.interactable = true;
     }
     else
     {
         Outline.effectColor = Color.red;
         Button.interactable = false;
     }
 }
コード例 #4
0
    public void LoadLevel(Declarations.LevelData level)
    {
        CurrentLevel = level;
        Health       = level.StartHealth;
        Money        = level.StartMoney;

        Time.timeScale = 1;
        GameSpedUp     = false;
        Paused         = false;

        SceneManager.LoadScene("Level", LoadSceneMode.Single);
    }
コード例 #5
0
    private static PointF[, ][] FillPointForHexes(Declarations.LevelData levelData, int HexHeight)
    {
        var pointForHexes = new PointF[levelData.MapSize.y, levelData.MapSize.x][];

        // Loop until a hexagon won't fit.
        for (int row = 0; row < levelData.MapSize.y; row++)
        {
            // Draw the row.
            for (int col = 0; col < levelData.MapSize.x; col++)
            {
                var points = HexToPoints(HexHeight, row, col);
                pointForHexes[row, col] = points;
            }
        }
        return(pointForHexes);
    }
コード例 #6
0
    private void FileLoaded(string path)
    {
        var levelFile = XElement.Load(path);

        if (levelFile != null)
        {
            Declarations.LevelData levelData;
            DataReader.ReadLevelData(levelFile, out levelData, true);
            if (levelData != null)
            {
                currentlyLoadedLevel = levelData;
                LoadLevel();
            }
        }
        else
        {
            Debug.Log("Cant load level!");
        }
        EnableDisablePanels(true);
    }
コード例 #7
0
    private static void DrawHexGrid(System.Drawing.Graphics gr, PointF[, ][] pointForHexes, Declarations.LevelData levelData)
    {
        for (int row = 0; row < levelData.MapSize.y; row++)
        {
            for (int col = 0; col < levelData.MapSize.x; col++)
            {
                var points = pointForHexes[row, col];

                var brush = Brushes.White;
                switch (levelData.Map[row, col])
                {
                case Declarations.TileType.Spawn:
                    brush = Brushes.Red;
                    break;

                case Declarations.TileType.Objective:
                    brush = Brushes.Yellow;
                    break;

                case Declarations.TileType.Grass:
                    brush = new SolidBrush(System.Drawing.Color.FromArgb(0, 100, 0));
                    break;

                case Declarations.TileType.Path:
                    brush = new SolidBrush(System.Drawing.Color.FromArgb(147, 104, 31));
                    break;

                case Declarations.TileType.Environment:
                    brush = new SolidBrush(System.Drawing.Color.FromArgb(0, 60, 0));
                    break;

                default:
                    break;
                }
                gr.FillPolygon(brush, points);
            }
        }
    }
コード例 #8
0
    public void CreateLevelClicked()
    {
        bool error          = false;
        var  invalidSymbols = new List <char> {
            '\\', '/', ':', '*', '?', '"', '<', '>', '|'
        };
        var name = newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <InputField>().text;
        int width;
        int height;
        int startMoney;
        int startHealth;

        if (string.IsNullOrEmpty(name) || name.Any(x => invalidSymbols.Contains(x)))
        {
            error = true;
            newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <Image>().sprite = TextFieldError;
        }
        else
        {
            newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal;
        }
        if (!int.TryParse(newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <InputField>().text, out startMoney) || startMoney <= 0)
        {
            error = true;
            newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <Image>().sprite = TextFieldError;
        }
        else
        {
            newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal;
        }
        if (!int.TryParse(newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <InputField>().text, out startHealth) || startHealth <= 0)
        {
            error = true;
            newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <Image>().sprite = TextFieldError;
        }
        else
        {
            newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal;
        }
        if (!int.TryParse(newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <InputField>().text, out width) || width < 10 || width > 50)
        {
            error = true;
            newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <Image>().sprite = TextFieldError;
        }
        else
        {
            newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal;
        }
        if (!int.TryParse(newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <InputField>().text, out height) || height < 10 || height > 50)
        {
            error = true;
            newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <Image>().sprite = TextFieldError;
        }
        else
        {
            newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal;
        }
        if (!error)
        {
            var map = new Declarations.TileType[height, width];
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    map[i, j] = Declarations.TileType.Grass;
                }
            }
            currentlyLoadedLevel = new Declarations.LevelData(name, new Declarations.IntVector2(width, height), map, new List <Declarations.WaveData>(), startMoney, startHealth);
            LoadLevel();
            newLevelPanel.SetActive(false);
            EnableDisablePanels(true);
        }
    }
コード例 #9
0
    public void GenerateMap(Declarations.LevelData levelData)
    {
        ClearMap();
        var startTime = Time.realtimeSinceStartup;

        MapSize = new Declarations.IntVector2(levelData.MapSize.x + (LeftRightBorderSize * 2), levelData.MapSize.y + TopBorderSize + BotBorderSize);

        CurrentLevel = levelData;
        TileTypeMap  = new Declarations.TileType[MapSize.y, MapSize.x];
        for (int row = 0; row < levelData.MapSize.y; row++)
        {
            for (int col = 0; col < levelData.MapSize.x; col++)
            {
                TileTypeMap[row + TopBorderSize, col + LeftRightBorderSize] = levelData.Map[row, col];
            }
        }
        int[,] heightMap = GenerateHeightMapForCurrentLevel();
        var heightMapGeneration = Time.realtimeSinceStartup - startTime;

        Map = new Tile[MapSize.y, MapSize.x];
        for (int row = 0; row < MapSize.y; row++)
        {
            for (int col = 0; col < MapSize.x; col++)
            {
                var tile             = GetObjectByTileType(TileTypeMap[row, col]);
                var tilePosition     = Helpers.GetPositionForTile(row - TopBorderSize, col - LeftRightBorderSize);
                var tileRealPosition = tilePosition;

                if (TileTypeMap[row, col] == Declarations.TileType.Grass || TileTypeMap[row, col] == Declarations.TileType.Environment)
                {
                    var randomFactor = GetRandomFactor(heightMap[row, col]);

                    var lift = heightMap[row, col] * 0.4f;
                    lift += UnityEngine.Random.Range(-randomFactor, randomFactor);
                    if (lift > 0)
                    {
                        tileRealPosition.y = lift;
                    }
                }

                var tileObj = Instantiate(tile, tileRealPosition, Quaternion.identity, transform).GetComponent <Tile>();
                tileObj.SetData(row, col, TileTypeMap[row, col]);
                tileObj.transform.rotation = Quaternion.Euler(new Vector3(0,
                                                                          (UnityEngine.Random.Range(0, 2) +
                                                                           UnityEngine.Random.Range(0, 2) +
                                                                           UnityEngine.Random.Range(0, 2) +
                                                                           UnityEngine.Random.Range(0, 2) +
                                                                           UnityEngine.Random.Range(0, 2)) * 60, 0));
                Map[row, col] = tileObj;

                if (tileRealPosition.y > 0)
                {
                    var lifterObj = Instantiate(Lifter, tilePosition, tileObj.transform.rotation, tileObj.transform).GetComponent <Lifter>();
                    lifterObj.transform.localScale = new Vector3(1, tileRealPosition.y, 1);

                    tileObj.SetLifter(lifterObj);
                    lifterObj.SetTile(tileObj);
                }
            }
        }

        var tilePlacement = Time.realtimeSinceStartup - startTime - heightMapGeneration;

        PutObjectives();
        RotateSpawner();
        var finishingTouches = Time.realtimeSinceStartup - startTime - heightMapGeneration - tilePlacement;

        Debug.Log("Total Seconds for new map generation: " + (Time.realtimeSinceStartup - startTime));
        Debug.Log("Seconds for height map generation: " + heightMapGeneration);
        Debug.Log("Seconds for tile placement: " + tilePlacement);
        Debug.Log("Seconds for finishing touches: " + finishingTouches);
    }