Exemple #1
0
    public void Generate()
    {
        visited = new bool[sections.Count];
        List <ConectedComponent> components = new List <ConectedComponent>();

        for (int i = 0; i < sections.Count; i++)
        {
            visited[i] = false;
        }
        for (int i = 0; i < sections.Count; i++)
        {
            if (!visited[i])
            {
                sections[i].x = 0;
                sections[i].y = 0;
                ConectedComponent current = new ConectedComponent {
                    origin = new int[2] {
                        0, 0
                    }, corner = new int[2] {
                        width - 1, height - 1
                    }, elements = new List <int>()
                };
                Dfs(i, current);
                components.Add(current);
            }
        }
        int[] origin = new int[] { 0, 0 };
        for (int i = 0; i < components.Count; i++)
        {
            MoveCoords(components[i], origin);
            origin[0] = components[i].corner[0];
        }
        int mapWidth  = origin[0] + width;
        int mapHeight = origin[1] + height;

        for (int k = 0; k < sections.Count; k++)
        {
            if (sections[k] == null)
            {
                continue;
            }
            TileBase tile = Resources.Load <TileBase>(RuleTileGenerator.RULE_TILES_PATH + sections[k].filler) as TileBase;
            if (tile == null)
            {
                Debug.Log("Resource tile load failed");
            }
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    int x = sections[k].x + i;
                    int y = sections[k].y + j;
                    if (sections[k].map[i, j] == 1)
                    {
                        tilemap.SetTile(new Vector3Int(x, y, 0), tile);
                    }
                }
            }
        }
    }
Exemple #2
0
 private void Join(ConectedComponent component, Section origin, Section destiny, int direction)
 {
     if (direction == 0)
     {
         destiny.x = origin.x - width;
         destiny.y = origin.y;
     }
     else if (direction == 1)
     {
         destiny.x = origin.x;
         destiny.y = origin.y + height;
     }
     else if (direction == 2)
     {
         destiny.x = origin.x + width;
         destiny.y = origin.y;
     }
     else
     {
         destiny.x = origin.x;
         destiny.y = origin.y - height;
     }
     component.origin[0] = Min(origin.x, destiny.x);
     component.origin[1] = Min(origin.y, destiny.y);
     component.corner[0] = Max(origin.x, destiny.x) + width;
     component.corner[1] = Max(origin.y, destiny.y) + height;
 }
Exemple #3
0
    private void MoveCoords(ConectedComponent component, int[] origin)
    {
        int Cx = component.origin[0] - origin[0];
        int Cy = component.origin[1] - origin[1];

        for (int i = 0; i < component.elements.Count; i++)
        {
            int idx = component.elements[i];
            sections[idx].x = sections[idx].x - Cx;
            sections[idx].y = sections[idx].y - Cy;
        }
        component.origin[0] = component.origin[0] - Cx;
        component.origin[1] = component.origin[1] - Cy;
        component.corner[0] = component.corner[0] - Cx;
        component.corner[1] = component.corner[1] - Cy;
    }
Exemple #4
0
 private void Dfs(int node, ConectedComponent current)
 {
     visited[node] = true;
     current.elements.Add(node);
     for (int i = 0; i < 4; i++)
     {
         int nextNode = sections[node].neighbors[i];
         if (nextNode == -1)
         {
             continue;
         }
         if (!visited[nextNode])
         {
             Join(current, sections[node], sections[nextNode], i);
             Dfs(nextNode, current);
         }
     }
 }