コード例 #1
0
        private void Decorade(Chunk chunk, int x, int z, PopulationParam populationParam, IDecoration decoration)
        {
            if (decoration == null || chunk == null)
            {
                return;
            }
            int height = populationParam.maxDecorationHeight < heightCap ? populationParam.maxDecorationHeight : heightCap;

            //找出适合当前装饰品的高度
            for (int y = height - 1; y >= populationParam.minDecorationHeight; y--)
            {
                BlockType curType = chunk.GetBlock(x, y, z).BlockType;
                if (curType != BlockType.Air && curType != BlockType.StillWater)
                {
                    List <CheckCondition> conditions = populationParam.checkConditions;
                    bool canDecorate = CheckConditionMeet(chunk, conditions, x, y, z);
                    if (canDecorate && _random.Range(0, 100) < populationParam.heightGenerateRate)
                    {
                        if (decoration.Decorade(chunk, x, y + 1, z, _random))
                        {
                            return;
                        }
                    }
                }
            }
        }
コード例 #2
0
        private void DispatchDecoration(Chunk chunk, int x, int z, PopulationParam populationParam, IDecoration decoration, int curBiomeId)
        {
            Decorade(chunk, x, z, populationParam, decoration);
            int size = _random.Range(populationParam.minSize, populationParam.maxSize);

            for (int i = 0; i < size; i++)
            {
                int dis   = _random.Range(populationParam.minParentDis, populationParam.maxParentDis);
                int minX  = Math.Max(0, x - dis);
                int maxX  = Math.Min(Chunk.chunkWidth, x + dis) + 1;
                int minZ  = Math.Max(0, z - dis);
                int maxZ  = Math.Min(Chunk.chunkDepth, z + dis) + 1;
                int nextX = _random.Range(minX, maxX);
                if (nextX < 0 || nextX > Chunk.chunkWidth - 1)
                {
                    continue;
                }
                int nextZ = _random.Range(minZ, maxZ);
                if (nextZ < 0 || nextZ > Chunk.chunkDepth - 1)
                {
                    continue;
                }
                if (chunk.GetBiomeId(nextX, nextZ) != curBiomeId)
                {
                    continue;
                }
                Decorade(chunk, nextX, nextZ, populationParam, decoration);
            }
        }
コード例 #3
0
        private void GeneratePopulation(Chunk chunk, BiomeConfig biomeConfig)
        {
            for (int i = 0; i < biomeConfig.populationParams.Count; i++)
            {
                PopulationParam populationParam = biomeConfig.populationParams[i];
                if (_random.Range(0, 100) < populationParam.productRate)
                {
                    IDecoration decoration = DecorationFactory.GetDecoration(populationParam.decorationType);

                    for (int j = 0; j < populationParam.frequency; j++)
                    {
                        int x = _random.Range(0, Chunk.chunkWidth);
                        int z = _random.Range(0, Chunk.chunkDepth);
                        if (chunk.GetBiomeId(x, z, true) != biomeConfig.biomeId)
                        {
                            continue;
                        }
                        DispatchDecoration(chunk, x, z, populationParam, decoration, biomeConfig.biomeId);
                    }
                }
            }
        }