private void rekursiveSetBlock(Chunk _Chunk, Enum _Enum, int _PosX, int _PosY, int _Chance, int _ChanceToDecrease) { int var_Chance = Utility.Random.GenerateGoodRandomNumber(0, 100); if (var_Chance <= _Chance) { if (_PosX >= 0 && _PosX <= (_Chunk.Size.X-1)) { if (_PosY >= 0 && _PosY <= (_Chunk.Size.Y - 1)) { Block var_Block = _Chunk.getBlockAtPosition(_PosX, _PosY); if (var_Block.Layer[(int)BlockLayerEnum.Layer2] != BlockEnum.Nothing || _Chance <= 0) { return; } if (var_Block.Layer[0] == BlockEnum.Wall) { return; } _Chunk.getBlockAtPosition(_PosX, _PosY).setLayerAt(_Enum, BlockLayerEnum.Layer2); rekursiveSetBlock(_Chunk, _Enum, _PosX + 1, _PosY, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetBlock(_Chunk, _Enum, _PosX - 1, _PosY, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetBlock(_Chunk, _Enum, _PosX, _PosY + 1, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetBlock(_Chunk, _Enum, _PosX, _PosY - 1, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); } } } }
/*private void generateWall(Chunk _Chunk) { int var_Count = 10; for (int i = 0; i < var_Count; i++) { int var_PosX = Utility.Random.GenerateGoodRandomNumber(0, (int)_Chunk.Size.X); int var_PosY = Utility.Random.GenerateGoodRandomNumber(0, (int)_Chunk.Size.Y); rekursiveSetWall(_Chunk, BlockEnum.Wall, var_PosX, var_PosY, 100, 5); } } private void rekursiveSetWall(Chunk _Chunk, Enum _Enum, int _PosX, int _PosY, int _Chance, int _ChanceToDecrease) { int var_Chance = Utility.Random.GenerateGoodRandomNumber(0, 100); if (var_Chance <= _Chance) { if (_PosX >= 0 && _PosX <= (_Chunk.Size.X - 1)) { if (_PosY >= 0 && _PosY <= (_Chunk.Size.Y - 1)) { if (_Chance <= 0) { return; } _Chunk.getBlockAtPosition(_PosX, _PosY).setFirstLayer(_Enum); rekursiveSetWall(_Chunk, _Enum, _PosX + 1, _PosY, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetWall(_Chunk, _Enum, _PosX - 1, _PosY, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetWall(_Chunk, _Enum, _PosX, _PosY + 1, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); rekursiveSetWall(_Chunk, _Enum, _PosX, _PosY - 1, (_Chance - _ChanceToDecrease), _ChanceToDecrease * Utility.Random.GenerateGoodRandomNumber(1, 3)); } } } }*/ private void generateHeightMap(Chunk _Chunk) { int var_Min = 0; int var_Max = 10; int var_RandomRange = 5; float[,] var_HeightMap = new float[(int)_Chunk.Size.X, (int)_Chunk.Size.Y]; for (int x = 0; x < var_HeightMap.GetLength(0); x++) { for (int y = 0; y < var_HeightMap.GetLength(1); y++) { var_HeightMap[x, y] = var_Min + Utility.Random.GenerateGoodRandomNumber(0, var_RandomRange); } } for (int x = 0; x < var_HeightMap.GetLength(0); x++) { for (int y = 0; y < var_HeightMap.GetLength(1); y++) { float var_Add = 0; if (x - 1 >= 0) { var_Add += var_HeightMap[x - 1, y]; } if (x + 1 < var_HeightMap.GetLength(0)) { var_Add += var_HeightMap[x + 1, y]; } if (y - 1 >= 0) { var_Add += var_HeightMap[x, y - 1]; } if (y + 1 < var_HeightMap.GetLength(1)) { var_Add += var_HeightMap[x, y + 1]; } var_HeightMap[x, y] = var_Add/4 + Utility.Random.GenerateGoodRandomNumber(0, var_RandomRange) / 2; if (var_HeightMap[x, y] > var_Max) { var_HeightMap[x, y] = var_Max; } if (var_HeightMap[x, y] >= 3) { Block var_Block = _Chunk.getBlockAtPosition(x, y); var_Block.Height = 1; } } } /* for (int x = 0; x < var_HeightMap.GetLength(0); x++) { for (int y = 0; y < var_HeightMap.GetLength(1); y++) { if (var_HeightMap[x, y] >= 3) { Block var_Block = _Chunk.getBlockAtPosition(x, y); var_Block.Height = 1; if (var_Block.RightNeighbour != null) { if (((Block)var_Block.RightNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Right; } } if (var_Block.LeftNeighbour != null) { if (((Block)var_Block.LeftNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Left; } } if (var_Block.TopNeighbour != null) { if (((Block)var_Block.TopNeighbour).Height < var_Block.Height) { _Chunk.getBlockAtPosition(x, y).Layer[0] = BlockEnum.Hill1_Top; if (var_Block.LeftNeighbour != null) { if (((Block)var_Block.LeftNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Corner1; } } if (var_Block.RightNeighbour != null) { if (((Block)var_Block.RightNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Corner2; } } } } if (var_Block.BottomNeighbour != null) { if (((Block)var_Block.BottomNeighbour).Height < var_Block.Height) { _Chunk.getBlockAtPosition(x, y).Layer[0] = BlockEnum.Hill1_Bottom; if (var_Block.LeftNeighbour != null) { if (((Block)var_Block.LeftNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Corner4; } } if (var_Block.RightNeighbour != null) { if (((Block)var_Block.RightNeighbour).Height < var_Block.Height) { var_Block.Layer[0] = BlockEnum.Hill1_Corner3; } } } } if (var_Block.Layer[0] == BlockEnum.Ground1) { var_Block.Layer[0] = BlockEnum.Hill1_Center; } } } } for (int x = 0; x < var_HeightMap.GetLength(0); x++) { for (int y = 0; y < var_HeightMap.GetLength(1); y++) { if (var_HeightMap[x, y] >= 3) { Block var_Block = _Chunk.getBlockAtPosition(x, y); if (var_Block.BottomNeighbour != null) { if (((Block)var_Block.BottomNeighbour).Layer[0] == BlockEnum.Hill1_Right) { if (var_Block.RightNeighbour != null) { if (((Block)var_Block.RightNeighbour).Layer[0] == BlockEnum.Hill1_Bottom) { var_Block.Layer[0] = BlockEnum.Hill1_InsideCorner1; } } } if (((Block)var_Block.BottomNeighbour).Layer[0] == BlockEnum.Hill1_Left) { if (var_Block.LeftNeighbour != null) { if (((Block)var_Block.LeftNeighbour).Layer[0] == BlockEnum.Hill1_Bottom) { var_Block.Layer[0] = BlockEnum.Hill1_InsideCorner2; } } } } if (var_Block.TopNeighbour != null) { if (((Block)var_Block.TopNeighbour).Layer[0] == BlockEnum.Hill1_Left) { if (var_Block.LeftNeighbour != null) { if (((Block)var_Block.LeftNeighbour).Layer[0] == BlockEnum.Hill1_Top) { var_Block.Layer[0] = BlockEnum.Hill1_InsideCorner3; } } } if (((Block)var_Block.TopNeighbour).Layer[0] == BlockEnum.Hill1_Right) { if (var_Block.RightNeighbour != null) { if (((Block)var_Block.RightNeighbour).Layer[0] == BlockEnum.Hill1_Top) { var_Block.Layer[0] = BlockEnum.Hill1_InsideCorner4; } } } } } } }*/ //AUSGABE for (int y = 0; y < var_HeightMap.GetLength(1); y++) { for (int x = 0; x < var_HeightMap.GetLength(0); x++) { Console.Write( (int)var_HeightMap[x, y] + " "); } Console.WriteLine(); } }
private void generateWall(Chunk _Chunk, int _PosX, int _PosY) { int var_Steps = 112; int var_StepsUp = var_Steps/4; int var_StepsLeft = var_Steps/4; int var_StepsRight = var_Steps/4; int var_StepsDown = var_Steps/4; int var_ComeFrom = -1; //0=Up,1=Left,2=Right,3=Down _Chunk.getBlockAtPosition(_PosX, _PosY).setFirstLayer(BlockEnum.Wall); List<Block> blocksWithWall = new List<Block>(); while (var_StepsUp + var_StepsLeft + var_StepsRight + var_StepsDown > 0) { List<int> var_GoTo = new List<int>(); var_GoTo.AddRange(new List<int>() { 0, 1, 2, 3 }); var_GoTo.Remove(var_ComeFrom); if (var_StepsUp == 0 || _PosY < 0) { var_GoTo.Remove(0); } if (var_StepsLeft == 0 || _PosX < 0) { var_GoTo.Remove(1); } if (var_StepsRight == 0 || _PosX >= Chunk.chunkSizeX) { var_GoTo.Remove(2); } if (var_StepsDown == 0 || _PosY >= Chunk.chunkSizeY) { var_GoTo.Remove(3); } if (var_GoTo.Count == 0) { var_GoTo.Add(var_ComeFrom); } int var_Rand = Utility.Random.GenerateGoodRandomNumber(0, var_GoTo.Count); int var_Choice = var_GoTo.ElementAt(var_Rand); if (var_Choice == 0 && var_StepsUp>0) { _PosX += 0; _PosY -= 1; var_ComeFrom = 3; var_StepsUp -= 1; } else if (var_Choice == 1 && var_StepsLeft > 0) { _PosX -= 1; _PosY += 0; var_ComeFrom = 2; var_StepsLeft -= 1; } else if (var_Choice == 2 && var_StepsRight > 0) { _PosX += 1; _PosY += 0; var_ComeFrom = 1; var_StepsRight -= 1; } else if (var_Choice == 3 && var_StepsDown > 0) { _PosX += 0; _PosY += 1; var_ComeFrom = 0; var_StepsDown -= 1; } Block var_Block = _Chunk.getBlockAtPosition(_PosX, _PosY); if (var_Block != null) { var_Block.setFirstLayer(BlockEnum.Wall); blocksWithWall.Add(var_Block); } } for (int x = 0; x < blocksWithWall.Count / 2; x++) { Block var_Block1 = blocksWithWall.ElementAt(x); Block var_Block2 = blocksWithWall.ElementAt(blocksWithWall.Count - x - 1); while (!var_Block1.Equals(var_Block2)) { int moveHorizontal = 0; int moveVertical = 0; if (var_Block1.Position.X < var_Block2.Position.X) { moveHorizontal = 1; } else if (var_Block1.Position.X > var_Block2.Position.X) { moveHorizontal = -1; } if (var_Block1.Position.Y < var_Block2.Position.Y) { moveVertical = 1; } else if (var_Block1.Position.Y > var_Block2.Position.Y) { moveVertical = -1; } if (moveHorizontal == 1 && moveVertical == 1) { var_Block1 = var_Block1.RightNeighbour.BottomNeighbour as Block; } else if (moveHorizontal == 1 && moveVertical == 0) { var_Block1 = var_Block1.RightNeighbour as Block; } else if (moveHorizontal == 1 && moveVertical == -1) { var_Block1 = var_Block1.RightNeighbour.TopNeighbour as Block; } else if (moveHorizontal == 0 && moveVertical == 1) { var_Block1 = var_Block1.BottomNeighbour as Block; } else if (moveHorizontal == 0 && moveVertical == -1) { var_Block1 = var_Block1.TopNeighbour as Block; } else if (moveHorizontal == -1 && moveVertical == 1) { var_Block1 = var_Block1.LeftNeighbour.BottomNeighbour as Block; } else if (moveHorizontal == -1 && moveVertical == 0) { var_Block1 = var_Block1.LeftNeighbour as Block; } else if (moveHorizontal == -1 && moveVertical == -1) { var_Block1 = var_Block1.LeftNeighbour.TopNeighbour as Block; } if (var_Block1 != null) { var_Block1.setFirstLayer(BlockEnum.Wall); } else { Logger.Logger.LogErr("Wallgenerierung hat Chunkgrenzen übersprungen und kann somit nicht ausgefüllt werden"); return; } } } }
public void setAllNeighboursOfChunk(Chunk.Chunk _Chunk) { Chunk.Chunk var_ChunkNeighbourLeft = World.World.world.getChunkAtPosition(new Vector3(_Chunk.Position.X - Chunk.Chunk.chunkSizeX*Block.Block.BlockSize, _Chunk.Position.Y, 0)); if (var_ChunkNeighbourLeft != null) { _Chunk.LeftNeighbour = var_ChunkNeighbourLeft; var_ChunkNeighbourLeft.RightNeighbour = _Chunk; for (int blockY = 0; blockY < Chunk.Chunk.chunkSizeY; blockY++) { Block.Block var_BlockRight = _Chunk.getBlockAtPosition(0, blockY); Block.Block var_BlockLeft = var_ChunkNeighbourLeft.getBlockAtPosition(Chunk.Chunk.chunkSizeX - 1, blockY); if (var_BlockLeft != null && var_BlockRight != null) { var_BlockRight.LeftNeighbour = var_BlockLeft; var_BlockLeft.RightNeighbour = var_BlockRight; } } } Chunk.Chunk var_ChunkNeighbourRight = World.World.world.getChunkAtPosition(new Vector3(_Chunk.Position.X + Chunk.Chunk.chunkSizeX * Block.Block.BlockSize, _Chunk.Position.Y, 0)); if (var_ChunkNeighbourRight != null) { _Chunk.RightNeighbour = var_ChunkNeighbourRight; var_ChunkNeighbourRight.LeftNeighbour = _Chunk; for (int blockY = 0; blockY < Chunk.Chunk.chunkSizeY; blockY++) { Block.Block var_BlockRight = var_ChunkNeighbourRight.getBlockAtPosition(0, blockY); Block.Block var_BlockLeft = _Chunk.getBlockAtPosition(Chunk.Chunk.chunkSizeX - 1, blockY); if (var_BlockLeft != null && var_BlockRight != null) { var_BlockLeft.RightNeighbour = var_BlockRight; var_BlockRight.LeftNeighbour = var_BlockLeft; } } } Chunk.Chunk var_ChunkNeighbourTop = World.World.world.getChunkAtPosition(new Vector3(_Chunk.Position.X, _Chunk.Position.Y - Chunk.Chunk.chunkSizeX * Block.Block.BlockSize, 0)); if (var_ChunkNeighbourTop != null) { _Chunk.TopNeighbour = var_ChunkNeighbourTop; var_ChunkNeighbourTop.BottomNeighbour = _Chunk; for (int blockX = 0; blockX < Chunk.Chunk.chunkSizeX; blockX++) { Block.Block var_BlockTop = var_ChunkNeighbourTop.getBlockAtPosition(blockX, Chunk.Chunk.chunkSizeY - 1); Block.Block var_BlockBottom = _Chunk.getBlockAtPosition(blockX, 0); if (var_BlockTop != null && var_BlockBottom != null) { var_BlockBottom.TopNeighbour = var_BlockTop; var_BlockTop.BottomNeighbour = var_BlockBottom; } } } Chunk.Chunk var_ChunkNeighbourBottom = World.World.world.getChunkAtPosition(new Vector3(_Chunk.Position.X, _Chunk.Position.Y + Chunk.Chunk.chunkSizeX * Block.Block.BlockSize, 0)); if (var_ChunkNeighbourBottom != null) { _Chunk.BottomNeighbour = var_ChunkNeighbourBottom; var_ChunkNeighbourBottom.TopNeighbour = _Chunk; for (int blockX = 0; blockX < Chunk.Chunk.chunkSizeX; blockX++) { Block.Block var_BlockTop = _Chunk.getBlockAtPosition(blockX, Chunk.Chunk.chunkSizeY - 1); Block.Block var_BlockBottom = var_ChunkNeighbourBottom.getBlockAtPosition(blockX, 0); if (var_BlockTop != null && var_BlockBottom != null) { var_BlockTop.BottomNeighbour = var_BlockBottom; var_BlockBottom.TopNeighbour = var_BlockTop; } } } }