private void FloodFill() { // Use a stack instead of recursion Stack <WorldTile> stack = new Stack <WorldTile>(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { WorldTile t = Tiles[x, y]; //Tile already flood filled, skip if (t.TerrainData.FloodFilled) { continue; } // Land if (t.TerrainData.Collidable) { TileGroup group = new TileGroup(); group.Type = TileGroupType.Land; stack.Push(t); while (stack.Count > 0) { FloodFill(stack.Pop(), ref group, ref stack); } if (group.Tiles.Count > 0) { Lands.Add(group); } } // Water else { TileGroup group = new TileGroup(); group.Type = TileGroupType.Water; stack.Push(t); while (stack.Count > 0) { FloodFill(stack.Pop(), ref group, ref stack); } if (group.Tiles.Count > 0) { Waters.Add(group); } } } } }
private void FloodFill(WorldTile tile, ref TileGroup tiles, ref Stack <WorldTile> stack) { // Validate if (tile == null) { return; } if (tile.TerrainData.FloodFilled) { return; } if (tiles.Type == TileGroupType.Land && !tile.TerrainData.Collidable) { return; } if (tiles.Type == TileGroupType.Water && tile.TerrainData.Collidable) { return; } // Add to TileGroup tiles.Tiles.Add(tile); tile.TerrainData.FloodFilled = true; // floodfill into neighbors WorldTile t = GetTop(tile); if (t != null && !t.TerrainData.FloodFilled && tile.TerrainData.Collidable == t.TerrainData.Collidable) { stack.Push(t); } t = GetBottom(tile); if (t != null && !t.TerrainData.FloodFilled && tile.TerrainData.Collidable == t.TerrainData.Collidable) { stack.Push(t); } t = GetLeft(tile); if (t != null && !t.TerrainData.FloodFilled && tile.TerrainData.Collidable == t.TerrainData.Collidable) { stack.Push(t); } t = GetRight(tile); if (t != null && !t.TerrainData.FloodFilled && tile.TerrainData.Collidable == t.TerrainData.Collidable) { stack.Push(t); } }