Beispiel #1
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #2
0
        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);
            }
        }