コード例 #1
0
    private void BuildOcean(int seed)
    {
        int  halfMap     = mMapSize / 2;
        Tile currentTile = null;

        PerlinGenerator oceanGen     = new PerlinGenerator();
        int             oceanOctaves = 5;

        float[][] oceanNoise = oceanGen.Generate(seed, oceanOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                float height = oceanNoise[x][y];
                if (height < 0.35f)
                {
                    currentTile = mTiles[(int)eTileType.DeepWater];
                }
                else
                {
                    currentTile = mTiles[(int)eTileType.ShallowWater];
                }

                int        worldPosX = x - halfMap;
                int        worldPosY = y - halfMap;
                Vector3Int pos       = new Vector3Int(worldPosX, worldPosY, 0);

                mWaterTileMap.SetTile(pos, currentTile);
            }
        }
    }
コード例 #2
0
ファイル: Biome.cs プロジェクト: AndrewZeitler/PerlinNoise2D
 public Biome(string name, int priority, float perlinZoom, float spawnChance, int seed)
 {
     Name            = name;
     Priority        = priority;
     Modifiers       = new List <BiomeModifier>();
     perlinGenerator = new PerlinGenerator(perlinZoom, spawnChance, seed);
 }
コード例 #3
0
    public void generate()
    {
        // Initialize Height Map
        float[,] heightMap = new float[CityGenerator.mapSize, CityGenerator.mapSize];

        //set the size
        CityGenerator.terrain.terrainData.size = new Vector3(CityGenerator.terrainSize, (CityGenerator.maxHeight - CityGenerator.minHeight), CityGenerator.terrainSize);

        //based on the size we also set the alphamap resolution
        CityGenerator.terrain.terrainData.alphamapResolution = CityGenerator.mapSize;
        if (CityGenerator.terrainMap == null)
        {
            //generate random terrain
            PerlinGenerator perlin = new PerlinGenerator(CityGenerator.terrainSeed, CityGenerator.terrainOctaves, CityGenerator.terrainPersistance, CityGenerator.terrainZoom, 0, 1);
            heightMap = perlin.getValues(CityGenerator.mapSize, CityGenerator.mapSize);
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Random Terrain Generated");
            }
        }
        else
        {
            //use the given terrain Map
            TextureReader g = new TextureReader();
            heightMap = g.readTexture(CityGenerator.terrainMap, CityGenerator.mapSize);
        }

        int w = heightMap.GetLength(0);
        int h = heightMap.GetLength(1);

        float[,] result = new float[h, w];

        for (int i = 0; i < w; i++)
        {
            for (int j = 0; j < h; j++)
            {
                result[j, i] = heightMap[i, j];
            }
        }

        heightMap = result;

        CityGenerator.terrain.terrainData.SetHeights(0, 0, heightMap);
        CityGenerator.terrain.gameObject.transform.position = new Vector3(0, CityGenerator.minHeight, 0);

        if (CityGenerator.rWater)
        {
            // we must assign a new water to the terrain, so that the coordinates are updated
            GameObject.DestroyImmediate(GameObject.Find("Water(Clone)"));
            CityGenerator.water = GameObject.Instantiate((GameObject)Resources.Load("Water"));

            // water is at height 0
            CityGenerator.water.transform.position   = new Vector3(CityGenerator.terrainSize / 2f, 0, CityGenerator.terrainSize / 2f);
            CityGenerator.water.transform.localScale = new Vector3(Mathf.Sqrt(2) * CityGenerator.terrainSize / 2f, 1, Mathf.Sqrt(2) * CityGenerator.terrainSize / 2f);
        }
        else
        {
            GameObject.DestroyImmediate(GameObject.Find("Water(Clone)"));
        }
    }
コード例 #4
0
        /// <summary>
        /// Returns 2 dimensional perlin noise of the specified size and with the given parameters. See documentation for more information
        /// on parameters and recommended values.
        /// </summary>
        /// <param name="width">The width of the noise</param>
        /// <param name="height">The height of the noise</param>
        /// <param name="frequency">The frequency of the noise function.A high frequency will make the noise look more random
        /// while a low frequency will make the noise look more flat and bland.
        /// Default : 1</param>
        /// <param name="persistence">The rate at which the frequency decreases for each octave. Increasing this value will make the noise
        /// rougher, while decreasing it will make it smoother.
        /// Default : 0.5 , Min : 0</param>
        /// <param name="octaveCount">The octave count determines how many noise functions are combined. Increasing this value will make
        /// the noise look more fractal, decreasing it will make the noise look more simple and stylized.
        /// Increasing this value will significantly increase computation time.
        /// Default : 6 , Min : 1 , Max : 32</param>
        /// <param name="amplitude">The highest value any point in the noise can have. Default : 1</param>
        public static float[,] RandPerlinNoise2(int width, int height, float frequency, float persistence, int octaveCount, float amplitude)
        {
            if (width <= 0 || width > MAX_PERLIN_SIZE || height <= 0 || height > MAX_PERLIN_SIZE)
            {
                throw new ArgumentException(string.Format("Noise width and height must be between 1 and {0}", MAX_PERLIN_SIZE));
            }
            if (frequency < 0)
            {
                throw new ArgumentException("Frequency must be greater than zero");
            }
            if (persistence < 0)
            {
                throw new ArgumentException("Persistence must be greater than zero");
            }
            if (octaveCount <= 0 || octaveCount > MAX_OCTAVE_COUNT)
            {
                throw new ArgumentException(string.Format("Octave count must be between 1 and {0}", MAX_OCTAVE_COUNT));
            }
            if (amplitude < 0)
            {
                throw new ArgumentException("Amplitude can't be less than zero");
            }

            PerlinGenerator generator = new PerlinGenerator(width, height, frequency, persistence, octaveCount, amplitude);

            return(generator.GetPerlinNoise());
        }
コード例 #5
0
    public float[,] generate()
    {
        // IF population density map must be generated randomly then we do it
        if (CityGenerator.popMapInput == null)
        {
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Generating Random Population Density Map...");
            }
            pg      = new PerlinGenerator(CityGenerator.popSeed, CityGenerator.popOctaves, CityGenerator.popPersistance, CityGenerator.popZoom, 0, 1);
            fPopMap = pg.getValues(CityGenerator.mapSize, CityGenerator.mapSize);
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Random Population Density Map generated!");
            }
        }
        // ELSE population map should be passed as input by the user
        else
        {
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Population Density Map generated using existing map");
            }

            //make a new reader and use it to read the texture
            TextureReader g = new TextureReader();
            fPopMap = g.readTexture(CityGenerator.popMapInput, CityGenerator.mapSize);
        }

        findPeaks();

        return(fPopMap);
    }
コード例 #6
0
    public IslandData Generate(WorldGenerator.IslandSize size, int seed, Vector3 position, float[][] moistureNoise, float[][] tempNoise, int numHeightLevels, bool fromTool = false)
    {
        if (_terrainSplats == null)
        {
            _terrainSplats = LoadPrototypes();
        }

        _id = IslandID++;
        int             realSize       = (int)size;
        PerlinGenerator islandNoiseGen = new PerlinGenerator();
        int             octaves        = 5;

        float[][] noise = islandNoiseGen.Generate(seed, octaves, realSize);
        float[,] heights = CreateHeightMap(noise, realSize, numHeightLevels);

        Vector3 posWithOffset = new Vector3(position.x - (realSize / 2f), position.y, position.z - (realSize / 2f));

        TerrainData tData = ApplyDataToTerrain(ref _currentTerrain, heights, realSize, numHeightLevels, fromTool);

        _currentTerrain.transform.position = posWithOffset;

        IslandData data = new IslandData(_id, realSize, posWithOffset, ref tData);

        //PopulateTiles(ref data, posWithOffset, moistureNoise, tempNoise, heights, realSize, ref tData);
        //DebugDrawGrid(posWithOffset, realSize, heights);

        PlaceDetails(heights, realSize, ref data, seed);

        return(data);
    }
コード例 #7
0
    void Awake()
    {
        PrimGenerator primGen = new PrimGenerator();

        // generate a map of size 20x20 with no extra walls removed
        MapTile[,] tiles1 = primGen.MapGen(maxX, maxY, 0.3f);
        PerlinGenerator perlinGen = new PerlinGenerator();

        // generates a map of size 20x20 with a large constraint (generates a tightly-packed map)
        map = perlinGen.MapGen(maxX, maxY, 5.0f);
        GameObject playerAI = Instantiate(player, new Vector3(0, 0, -.5f), Quaternion.identity);
        GameObject enemyAI1 = Instantiate(enemy1, new Vector3(0, 0, -.5f), Quaternion.identity);

        playerAI.GetComponent <playerScript>().map = map;
        //enemy1.GetComponent<enemyScript>().map = tiles3;
        walkables = new List <MapTile>();

        foreach (MapTile m in map)
        {
            if (m.Walkable)
            {
                walkables.Add(m);
            }
        }

        foreach (MapTile m in map)
        {
            Vector3       pos         = new Vector3(m.X + transform.position.x, m.Y + transform.position.y);
            int           walkableint = walkables.Count;
            System.Random rnd         = new System.Random();
            int           rndnum      = rnd.Next(0, walkableint - 1);

            if (m.IsStart)
            {
                Instantiate(startTile, pos, Quaternion.identity);
                playerAI.transform.position = new Vector3(m.X + transform.position.x, m.Y + transform.position.y, -.5f);
                playerAI.GetComponent <playerScript>().xMax  = maxX;
                playerAI.GetComponent <playerScript>().yMax  = maxY;
                playerAI.GetComponent <playerScript>().start = m;
            }
            else if (m.IsGoal)
            {
                Instantiate(goalTile, pos, Quaternion.identity);
                playerAI.GetComponent <playerScript>().goal = m;
            }
            else if (m.Walkable)
            {
                Instantiate(yesTile, pos, Quaternion.identity);
                if (m == walkables[rndnum])
                {
                    enemyAI1.transform.position = new Vector3(m.X + transform.position.x, m.Y + transform.position.y, -.5f);
                }
            }
            else if (!m.Walkable)
            {
                Instantiate(noTile, pos, Quaternion.identity);
            }
        }
    }
コード例 #8
0
 void Update()
 {
     if (!Ready && m_started)
     {
         Texture2D perlin = PerlinGenerator.CreatePerlinTexture(width, height, xOrg, yOrg, scale);
         GenerateLevelFromBitmap(ApplyThresholds(perlin));
     }
 }
コード例 #9
0
        public WorldGenerator(int seed = -1)
        {
            this.seed = (seed != -1 ? seed : System.Environment.TickCount);
            Debug.Log("Seed: " + seed);
            perlinGenerator = new PerlinGenerator(0.05f, 0, seed);

            DimensionRegistry.RegisterDimension(new SurfaceDimension(seed));
            World.WorldManager.SetDimension("Surface");
        }
コード例 #10
0
 void Awake()
 {
     if (instance == null)
     {
         instance = this;
     }
     else if (instance != this)
     {
         Destroy(gameObject);
     }
 }
コード例 #11
0
ファイル: PerMap.cs プロジェクト: SethPain/Project_6
    void Awake()
    {

        prim = new PrimGenerator();
        perlin = new PerlinGenerator();

        // generate a map of size 30x30 with half of the walls removed after generation
        if (primOrPerlin == "Prim" || primOrPerlin == "prim")
            tiles = prim.MapGen(dimension, dimension, removOrConstrain);
        else
            tiles = perlin.MapGen(dimension, dimension, removOrConstrain);
    }
コード例 #12
0
    public GameObject Generate(WorldGenerator.IslandSize size, int seed, int numHeightLevels)
    {
        //fake climate data
        PerlinGenerator moistureNoiseGen = new PerlinGenerator();
        PerlinGenerator tempNoiseGen     = new PerlinGenerator();

        int octaves = 9;         // higher octaves (10+) create large biomes

        float[][] moistureNoise    = moistureNoiseGen.Generate(seed, octaves, (int)size);
        float[][] temperatureNoise = tempNoiseGen.Generate(seed, octaves, (int)size);

        // generate island
        Generate(size, seed, Vector3.zero, moistureNoise, temperatureNoise, numHeightLevels, true);
        return(_currentTerrain);
    }
コード例 #13
0
 MapTile[,] generateTilesList()
 {
     MapTile[,] tiles;
     if (perlinGenerator)
     {
         PerlinGenerator perlinGen = new PerlinGenerator();
         tiles = perlinGen.MapGen(width, height, perlinConstraint);
     }
     else
     {
         PrimGenerator primGen = new PrimGenerator();
         tiles = primGen.MapGen(width, height, primeConstraint);
     }
     return(tiles);
 }
コード例 #14
0
    private void BuildTerrain(int seed)
    {
        int  halfMap     = mMapSize / 2;
        Tile currentTile = null;

        PerlinGenerator terrainGen     = new PerlinGenerator();
        int             terrainOctaves = 5;

        float[][] terrainNoise = terrainGen.Generate(seed, terrainOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                float height = terrainNoise[x][y];
                if (height < 0.45f)
                {
                    continue; // don't cover up water
                }
                else if (height < 0.55f)
                {
                    currentTile = mTiles[(int)eTileType.Sand];
                }
                else if (height < 0.725f)
                {
                    currentTile = mTiles[(int)eTileType.Grass];
                }
                else if (height < 0.775f)
                {
                    currentTile = mTiles[(int)eTileType.Rock];
                }
                else if (height < 0.865f)
                {
                    currentTile = mTiles[(int)eTileType.Mountain];
                }
                else
                {
                    currentTile = mTiles[(int)eTileType.Snow];
                }

                int        worldPosX = x - halfMap;
                int        worldPosY = y - halfMap;
                Vector3Int pos       = new Vector3Int(worldPosX, worldPosY, 0);

                mTerrainTileMap.SetTile(pos, currentTile);
            }
        }
    }
コード例 #15
0
    void createN()
    {
        PerlinGenerator perlinGen = new PerlinGenerator();

        // generates a map of size 100x100 with a medium constraint (generates a more open map)
        tiles4 = perlinGen.MapGen(75, 75, 7.5f);

        foreach (MapTile a in tiles4)
        {
            if (a.IsGoal)
            {
                Instantiate(goalPlane, new Vector3(a.X, 0, a.Y), Quaternion.identity);
            }

            else if (a.IsStart)
            {
                Instantiate(startPlane, new Vector3(a.X, 0, a.Y), Quaternion.identity);
                Instantiate(pc, new Vector3(a.X, .5f, a.Y), Quaternion.identity);
            }

            else if (a.Walkable)
            {
                Instantiate(walkable, new Vector3(a.X, 0, a.Y), Quaternion.identity);
            }

            else
            {
                Instantiate(notWalkable, new Vector3(a.X, 1, a.Y), Quaternion.identity);
            }
        }
        foreach (MapTile a in tiles4)
        {
            if (a.Walkable)
            {
                int chance = Mathf.RoundToInt(Random.Range(.5f, 500.5f));
                if (chance == 1)
                {
                    Instantiate(enemy1, new Vector3(a.X, .5f, a.Y), Quaternion.identity);
                }
            }
        }
    }
コード例 #16
0
    private void GenerateWorld(int worldSeed)
    {
        GameObject      islGen    = (GameObject)Instantiate(_islandGenPrefab, Vector3.zero, Quaternion.identity);
        IslandGenerator generator = islGen.GetComponent <IslandGenerator>();

        System.Random worldPRNG = new System.Random(worldSeed);

        // biome/climate regions
        PerlinGenerator moistureNoiseGen = new PerlinGenerator();
        PerlinGenerator tempNoiseGen     = new PerlinGenerator();

        int octaves = 9;         // higher octaves (10+) create large biomes

        float[][] moistureNoise    = moistureNoiseGen.Generate(worldSeed, octaves, MaxWorldSize);
        float[][] temperatureNoise = tempNoiseGen.Generate(worldSeed, octaves, MaxWorldSize);

        for (int i = 0; i < NumberOfIslands; ++i)
        {
            MakeNewIsland(generator, worldPRNG.Next(), moistureNoise, temperatureNoise);
        }
    }
コード例 #17
0
    void Start()
    {
        PrimGenerator primGen = new PrimGenerator();

        // generate a map of size 20x20 with no extra walls removed
        MapTile[,] tiles1 = primGen.MapGen(20, 20, 0.0f);

        // generate a map of size 30x30 with half of the walls removed after generation
        MapTile[,] tiles2 = primGen.MapGen(30, 30, 0.5f);

        PerlinGenerator perlinGen = new PerlinGenerator();

        // generates a map of size 20x20 with a large constraint (generates a tightly-packed map)
        MapTile[,] tiles3 = perlinGen.MapGen(20, 20, 5.0f);

        // generates a map of size 20x20 with a medium constraint (generates a more open map)
        MapTile[,] tiles4 = perlinGen.MapGen(20, 20, 10.0f);

        // generates a map of size 20x20 with a small constraint (generates a very open map)
        MapTile[,] tiles5 = perlinGen.MapGen(20, 20, 20.0f);
    }
コード例 #18
0
    //private static int[] colors = { red, green, blue };

    public float[,] generate()
    {
        //set up array
        fGrowthMap = new float[CityGenerator.mapSize, CityGenerator.mapSize];

        // IF growth rule must be generated randomly then we do it
        if (CityGenerator.growthMapInput == null)
        {
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Generating Random Growth Rule Map...");
            }
            pg = new PerlinGenerator(CityGenerator.growthSeed, CityGenerator.growthOctaves, CityGenerator.growthPersistance, CityGenerator.growthZoom, 0, 1);

            float[,] perlinNoise = pg.getValues(CityGenerator.mapSize, CityGenerator.mapSize);

            float redBound   = CityGenerator.growthBasic;
            float greenBound = redBound + CityGenerator.growthNewYork;

            for (int i = 0; i < CityGenerator.mapSize; i++)
            {
                for (int j = 0; j < CityGenerator.mapSize; j++)
                {
                    if (perlinNoise[i, j] <= redBound)           // we choose red
                    {
                        fGrowthMap[i, j] = red;
                    }
                    else if (perlinNoise[i, j] <= greenBound)      // we choose green
                    {
                        fGrowthMap[i, j] = green;
                    }
                    else                                        // we choose blue
                    {
                        fGrowthMap[i, j] = blue;
                    }
                }
            }
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Random Growth Rule Map generated!");
            }
        }
        // ELSE growth rule should be passed as input by the user
        else
        {
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("GrowthRule Map generated using existing map");
            }

            // IF the map given in input is of the right size, then we are happy
            if (CityGenerator.growthMapInput.height == CityGenerator.mapSize && CityGenerator.growthMapInput.width == CityGenerator.mapSize)
            {
                //the array that will contain all the pixels of the texture
                Color[] pixelArray = new Color[CityGenerator.mapSize * CityGenerator.mapSize];
                pixelArray = CityGenerator.growthMapInput.GetPixels(0, 0, CityGenerator.mapSize, CityGenerator.mapSize);

                for (int i = 0; i < pixelArray.Length; i += CityGenerator.mapSize)
                {
                    for (int j = i; j < i + CityGenerator.mapSize; j++)
                    {
                        if (pixelArray[j].r == 1 && pixelArray[j].g == 0 && pixelArray[j].b == 0)
                        {
                            fGrowthMap[(j % CityGenerator.mapSize), (i / CityGenerator.mapSize)] = red;
                        }
                        if (pixelArray[j].r == 0 && pixelArray[j].g == 1 && pixelArray[j].b == 0)
                        {
                            fGrowthMap[(j % CityGenerator.mapSize), (i / CityGenerator.mapSize)] = green;
                        }
                        if (pixelArray[j].r == 0 && pixelArray[j].g == 0 && pixelArray[j].b == 1)
                        {
                            fGrowthMap[(j % CityGenerator.mapSize), (i / CityGenerator.mapSize)] = blue;
                        }
                    }
                }
            }
            // ELSE we show an error
            else
            {
                Debug.LogError("Map must have the same size of the terrain!");
            }
        }
        return(fGrowthMap);
    }
コード例 #19
0
ファイル: WorldGenerator.cs プロジェクト: Nyntendo/Isometric
        public List<Tile>[,] GenerateWorld()
        {
            PerlinGenerator heightPerlin = new PerlinGenerator(HeightSeed);
            PerlinGenerator mountainPerlin = new PerlinGenerator(MountainSeed);

            var world = new List<Tile>[MapWidth, MapHeight];

            //generate mountains
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    world[x, y] = new List<Tile>();

                    int height = (int)Math.Round((mountainPerlin.Noise(MountainNoisiness * x / (float)MapWidth, MountainNoisiness * y / (float)MapHeight, 0) + 0.5f) * MountainMaxHeight);

                    for (int i = 0; i <= height; i++)
                    {
                        world[x, y].Add(new Tile() { Type = TileType.mountain, ZPosition = i });
                    }
                }
            }

            // Generate land
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    int height = BaseLevel + (int)Math.Round((heightPerlin.Noise(TerrainNoisiness * x / (float)MapWidth, TerrainNoisiness * y / (float)MapHeight, 0) + 0.5f) * TerrainMaxHeight);

                    for (int i = 0; i <= height; i++)
                    {
                        if( !world[x,y].Any(tile => tile.ZPosition == i))
                            world[x, y].Add(new Tile() { Type = (i <= WaterLevel) ? TileType.sand : (i == height ? TileType.grass : TileType.dirt), ZPosition = i });
                    }
                }
            }

            // Generate water
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    while (world[x, y].OrderBy(tileHeight => tileHeight.ZPosition).Last().ZPosition < WaterLevel)
                    {
                        world[x, y].Add(new Tile() { Type = TileType.water, ZPosition = world[x, y].Last().ZPosition + 1 });
                    }
                }
            }

            // Generate trees
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    if (world[x, y].Last().Type == TileType.grass && _rand.Next(0, TreeProbability) == 0)
                    {
                        GenerateTree(x, y, world[x, y].Last().ZPosition, ref world);
                    }
                }

            }

            // Generate plants
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    var topTile = world[x, y].Where(tile => tile.Type != TileType.leafs).Last();

                    if (topTile.Type == TileType.grass && _rand.Next(0, PlantProbability) == 0)
                    {
                        var tileType = (TileType)_rand.Next((int)TileType.plant1, (int)TileType.bush2 + 1);
                        world[x, y].Add(new Tile() { Type = tileType, ZPosition = topTile.ZPosition + 1 });
                    }

                    if (topTile.Type == TileType.water && _rand.Next(0, PlantProbability) == 0)
                    {
                        var tileType = (TileType)_rand.Next((int)TileType.lilypad1, (int)TileType.lilypad2 + 1);
                        world[x, y].Add(new Tile() { Type = tileType, ZPosition = topTile.ZPosition + 1 });
                    }

                    if (topTile.Type == TileType.sand && _rand.Next(0, PlantProbability) == 0)
                    {
                        var tileType = (TileType)_rand.Next((int)TileType.cactus, (int)TileType.desertplant2 + 1);
                        world[x, y].Add(new Tile() { Type = tileType, ZPosition = topTile.ZPosition + 1 });
                    }
                }
            }

            // Hide hidden tiles
            for (int x = 0; x < MapWidth; x++)
            {
                for (int y = 0; y < MapHeight; y++)
                {
                    foreach (Tile tile in world[x, y])
                    {
                        if (IsHidden(x, y, tile.ZPosition, ref world) && Configuration.TileProperties[tile.Type].Transparency == 1.0f)
                            tile.Visible = false;
                        else
                            tile.Visible = true;
                    }
                }
            }

            return world;
        }
コード例 #20
0
 public PerlinTerrainModifier(int priority, TileData solidTile, float perlinZoom, float spawnChance, int seed) : base(priority)
 {
     this.solidTile  = solidTile;
     perlinGenerator = new PerlinGenerator(perlinZoom, spawnChance, seed);
 }
コード例 #21
0
    void Start()
    {
        PrimGenerator   primGen   = new PrimGenerator();
        PerlinGenerator perlinGen = new PerlinGenerator();

        switch (choice)
        {
        case 1:
            // generate a map of size 20x20 with no extra walls removed
            MapTile[,] tiles1 = primGen.MapGen(20, 20, 0.25f);
            for (int i = 0; i < 20; i++)
            {
                for (int y = 0; y < 20; y++)
                {
                    if (tiles1[i, y].Walkable == true)
                    {
                        if (tiles1[i, y].IsStart)
                        {
                            Instantiate(start, new Vector3(tiles1[i, y].X, .005f, tiles1[i, y].Y), Quaternion.identity);
                        }
                        else if (tiles1[i, y].IsGoal)
                        {
                            Instantiate(goal, new Vector3(tiles1[i, y].X, .005f, tiles1[i, y].Y), Quaternion.identity);
                        }
                        else
                        {
                            Instantiate(floor, new Vector3(tiles1[i, y].X, .005f, tiles1[i, y].Y), Quaternion.identity);
                        }
                    }
                    else
                    {
                        Instantiate(wall, new Vector3(tiles1[i, y].X, 1, tiles1[i, y].Y), Quaternion.identity);
                    }
                }
            }
            break;

        case 2:
            // generate a map of size 30x30 with half of the walls removed after generation
            MapTile[,] tiles2 = primGen.MapGen(30, 30, 0.15f);
            for (int i = 0; i < 30; i++)
            {
                for (int y = 0; y < 30; y++)
                {
                    if (tiles2[i, y].Walkable == true)
                    {
                        if (tiles2[i, y].IsStart)
                        {
                            Instantiate(start, new Vector3(tiles2[i, y].X, .005f, tiles2[i, y].Y), Quaternion.identity);
                        }
                        else if (tiles2[i, y].IsGoal)
                        {
                            Instantiate(goal, new Vector3(tiles2[i, y].X, .005f, tiles2[i, y].Y), Quaternion.identity);
                        }
                        else
                        {
                            Instantiate(floor, new Vector3(tiles2[i, y].X, .005f, tiles2[i, y].Y), Quaternion.identity);
                        }
                    }
                    else
                    {
                        Instantiate(wall, new Vector3(tiles2[i, y].X, 1, tiles2[i, y].Y), Quaternion.identity);
                    }
                }
            }
            break;

        case 3:
            // generates a map of size 20x20 with a large constraint (generates a tightly-packed map)
            MapTile[,] tiles3 = perlinGen.MapGen(20, 20, 5.0f);
            for (int i = 0; i < 20; i++)
            {
                for (int y = 0; y < 20; y++)
                {
                    if (tiles3[i, y].Walkable == true)
                    {
                        if (tiles3[i, y].IsStart)
                        {
                            Instantiate(start, new Vector3(tiles3[i, y].X, .005f, tiles3[i, y].Y), Quaternion.identity);
                        }
                        else if (tiles3[i, y].IsGoal)
                        {
                            Instantiate(goal, new Vector3(tiles3[i, y].X, .005f, tiles3[i, y].Y), Quaternion.identity);
                        }
                        else
                        {
                            Instantiate(floor, new Vector3(tiles3[i, y].X, .005f, tiles3[i, y].Y), Quaternion.identity);
                        }
                    }
                    else
                    {
                        Instantiate(wall, new Vector3(tiles3[i, y].X, 1, tiles3[i, y].Y), Quaternion.identity);
                    }
                }
            }
            break;

        case 4:
            // generates a map of size 20x20 with a medium constraint (generates a more open map)
            MapTile[,] tiles4 = perlinGen.MapGen(20, 20, 10.0f);
            for (int i = 0; i < 20; i++)
            {
                for (int y = 0; y < 20; y++)
                {
                    if (tiles4[i, y].Walkable == true)
                    {
                        if (tiles4[i, y].IsStart)
                        {
                            Instantiate(start, new Vector3(tiles4[i, y].X, .005f, tiles4[i, y].Y), Quaternion.identity);
                        }
                        else if (tiles4[i, y].IsGoal)
                        {
                            Instantiate(goal, new Vector3(tiles4[i, y].X, .005f, tiles4[i, y].Y), Quaternion.identity);
                        }
                        else
                        {
                            Instantiate(floor, new Vector3(tiles4[i, y].X, .005f, tiles4[i, y].Y), Quaternion.identity);
                        }
                    }
                    else
                    {
                        Instantiate(wall, new Vector3(tiles4[i, y].X, 1, tiles4[i, y].Y), Quaternion.identity);
                    }
                }
            }
            break;

        case 5:
            // generates a map of size 20x20 with a small constraint (generates a very open map)
            MapTile[,] tiles5 = perlinGen.MapGen(20, 20, 20.0f);
            for (int i = 0; i < 20; i++)
            {
                for (int y = 0; y < 20; y++)
                {
                    if (tiles5[i, y].Walkable == true)
                    {
                        if (tiles5[i, y].IsStart)
                        {
                            Instantiate(start, new Vector3(tiles5[i, y].X, .005f, tiles5[i, y].Y), Quaternion.identity);
                        }
                        else if (tiles5[i, y].IsGoal)
                        {
                            Instantiate(goal, new Vector3(tiles5[i, y].X, .005f, tiles5[i, y].Y), Quaternion.identity);
                        }
                        else
                        {
                            Instantiate(floor, new Vector3(tiles5[i, y].X, .005f, tiles5[i, y].Y), Quaternion.identity);
                        }
                    }
                    else
                    {
                        Instantiate(wall, new Vector3(tiles5[i, y].X, 1, tiles5[i, y].Y), Quaternion.identity);
                    }
                }
            }
            break;
        }
    }
コード例 #22
0
    MapTile[,] generateMap()
    {
        //change maze
        //remember to change culling rate
        //PrimGenerator pGen = new PrimGenerator();
        PerlinGenerator pGen = new PerlinGenerator();

        MapTile[,] newMap = pGen.MapGen(xSize, ySize, cullingRate);
        //draw outside walls
        for (int i = -1; i < xSize + 1; i++)
        {
            (Instantiate(wall, new Vector3(i * 10, 5, -10), Quaternion.identity) as GameObject).transform.parent = transform;;
        }
        for (int i = -1; i < xSize + 1; i++)
        {
            (Instantiate(wall, new Vector3(i * 10, 5, ySize * 10), Quaternion.identity) as GameObject).transform.parent = transform;;
        }
        for (int i = -1; i < ySize + 1; i++)
        {
            (Instantiate(wall, new Vector3(-10, 5, i * 10), Quaternion.identity) as GameObject).transform.parent = transform;;
        }
        for (int i = -1; i < ySize + 1; i++)
        {
            (Instantiate(wall, new Vector3(xSize * 10, 5, i * 10), Quaternion.identity) as GameObject).transform.parent = transform;
        }

        //make player
        GameObject playerAI = Instantiate(player, Vector3.zero, Quaternion.identity);

        playerAI.GetComponent <PlayerScript>().map   = newMap;
        playerAI.GetComponent <PlayerScript>().xSize = xSize;
        playerAI.GetComponent <PlayerScript>().ySize = ySize;
        playerAI.transform.parent = transform;

        //make enemy
        spawnEnemy(1, newMap, playerAI);
        spawnWanderer(1, newMap, playerAI);

        //draw inside
        for (int i = 0; i < xSize; i++)
        {
            for (int j = 0; j < ySize; j++)
            {
                if (newMap[i, j].Walkable)
                {
                    GameObject newFloor = Instantiate(floor, new Vector3(i * 10, 0, j * 10), Quaternion.identity);
                    newFloor.transform.parent = transform;
                    if (newMap[i, j].IsGoal)
                    {
                        //goal is green
                        newFloor.GetComponent <Renderer>().material.color = Color.green;
                        playerAI.GetComponent <PlayerScript>().goal       = new Vector2(i, j);
                    }
                    if (newMap[i, j].IsStart)
                    {
                        //start is red
                        newFloor.GetComponent <Renderer>().material.color = Color.red;
                        playerAI.GetComponent <PlayerScript>().start      = new Vector2(i, j);
                    }
                }
                else
                {
                    (Instantiate(wall, new Vector3(i * 10, 5, j * 10), Quaternion.identity) as GameObject).transform.parent = transform;
                }
            }
        }
        requestGen = false;
        return(newMap);
    }
コード例 #23
0
    private void PlaceDetails(float[,] heights, int size, ref IslandData data, int seed)
    {
        System.Random prng            = new System.Random(seed);
        int           noiseSeed       = prng.Next();
        GameObject    detailContainer = new GameObject();

        detailContainer.name = "Details Container";
        detailContainer.transform.SetParent(_currentTerrain.transform);
        eBiome currentBiome = eBiome.Forest;

        PerlinGenerator detailNoiseGen = new PerlinGenerator();

        float[][] noise = detailNoiseGen.Generate(noiseSeed, 3, size);

        int detailID = -1;

        for (int i = 0; i < size; ++i)
        {
            for (int j = 0; j < size; ++j)
            {
                detailID = -1;
                bool  changeScale = false;
                float height      = heights[j, i];
                if (height > 0f)
                {
                    float value = noise[i][j];
                    //currentBiome = data.GetTile(i, j).Biome;

                    // slope
                    // need to map x/z to terrain space
                    float y_01 = (float)i / (float)size;
                    float x_01 = (float)j / (float)size;

                    // Calculate the steepness of the terrain
                    float steepness = data.Data.GetSteepness(y_01, x_01);

                    if (steepness < _maxVegetationSlope)
                    {
                        if (value > 0.85f)
                        {
                            detailID    = (int)eDetailType.Tree;
                            changeScale = true;

                            if (value > 0.95f)
                            {
                                // TODO set scale modifier here or something
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_0];
                            }
                            else if (value > 0.9f)
                            {
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_1];
                            }
                            else
                            {
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_2];
                            }
                        }
                        else if (value > 0.75f)
                        {
                            detailID = (int)eDetailType.Flower;
                            //detail = _detailObjects[(int)DetailType.Flower_Bud];
                        }
                        else if (value > 0.68f)
                        {
                            detailID = (int)eDetailType.Grass;
                            //detail = _detailObjects[(int)DetailType.Grass];
                        }
                        else if (value > 0.65f)
                        {
                            detailID = (int)eDetailType.Fern;
                            //detail = _detailObjects[(int)DetailType.Fern];
                        }
                        else if (value < 0.025f)
                        {
                            detailID = (int)eDetailType.Rock;
                            //detail = _detailObjects[(int)DetailType.Rock_Medium];
                        }

                        //if (detail != null)
                        if (detailID > -1)
                        {
                            //GameObject detail = null;
                            GameObject detail    = GetDetailsForBiome(currentBiome)[detailID];
                            GameObject detailObj = (GameObject)Instantiate(detail, Vector3.zero, Quaternion.identity);

                            float angle = prng.Next(359) + 1;
                            detailObj.transform.Rotate(Vector3.up, angle);

                            if (changeScale)
                            {
                                float scaleFactor = (float)prng.NextDouble() + 0.25f;
                                detailObj.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);
                            }

                            detailObj.transform.SetParent(detailContainer.transform);

                            // need to place a tile here
                            PlaceTile(i, j, ref data, _currentTerrain.transform.position);

                            data.AddObjectToTile(detailObj, i, j);
                        }
                    }
                }
            }
        }
    }
コード例 #24
0
 void Awake()
 {
     perlinGenerator = GetComponent<PerlinGenerator>();
 }
コード例 #25
0
 public PerlinSurfaceLayerGenerator(IEnumerable <string> blockLayer, float scale, float threshold) : base(blockLayer)
 {
     scale          *= 2.5f;
     perlinGen       = new PerlinGenerator(1f / scale);
     perlinThreshold = threshold;
 }
コード例 #26
0
    private void BuildBiomes(int seed)
    {
        int  halfMap             = mMapSize / 2;
        Tile currentTerrtainTile = null;

        System.Random rand = new System.Random(seed);

        PerlinGenerator moistureGen  = new PerlinGenerator();
        int             moistOctaves = 8;

        float[][] moistureNoise = moistureGen.Generate(rand.Next(), moistOctaves, mMapSize);

        PerlinGenerator temperatureGen = new PerlinGenerator();
        int             tempOctaves    = 9;

        float[][] tempNoise = temperatureGen.Generate(rand.Next(), tempOctaves, mMapSize);

        PerlinGenerator vegetationGen = new PerlinGenerator();
        int             vegOctaves    = 1;

        float[][] vegNoise = vegetationGen.Generate(rand.Next(), vegOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                int        worldPosX           = x - halfMap;
                int        worldPosY           = y - halfMap;
                Vector3Int pos                 = new Vector3Int(worldPosX, worldPosY, 0);
                TileBase   existingWaterTile   = mWaterTileMap.GetTile(pos);
                TileBase   existingTerrainTile = mTerrainTileMap.GetTile(pos);

                Biome currentBiome = GetBiome(moistureNoise[x][y], tempNoise[x][y]);

                // don't modify certain tiles
                if ((existingTerrainTile == null && currentBiome.ID != eBiomeID.Tundra) ||
                    existingTerrainTile == mTiles[(int)eTileType.Rock] ||
                    existingTerrainTile == mTiles[(int)eTileType.Mountain] ||
                    existingTerrainTile == mTiles[(int)eTileType.Snow])
                {
                    continue;
                }

                // tile from biome
                currentTerrtainTile = currentBiome.PrimaryTerrainTile;
                if (currentBiome.ID == eBiomeID.Tundra)
                {
                    if (existingTerrainTile == null)
                    {
                        // over water
                        if (existingWaterTile == mTiles[(int)eTileType.ShallowWater])
                        {
                            currentTerrtainTile = currentBiome.SecondaryTerrainTile;
                        }
                        else
                        {
                            // deep water
                            currentTerrtainTile = null;
                        }
                    }
                }

                // vegetation from biome
                if (existingTerrainTile != null && vegNoise[x][y] > 1f - currentBiome.VegetationModifier)
                {
                    mPlantTileMap.SetTile(pos, currentBiome.PrimaryTreeTile);
                }

                mTerrainTileMap.SetTile(pos, currentTerrtainTile);
            }
        }
    }