Beispiel #1
0
    public void Generate()
    {
        int generatedRooms = 0;
        int genStep        = 0;

        rooms    = new List <DGRoomClass>();
        coridors = new List <DGRoomClass>();
        while (generatedRooms < roomsCount && genStep < generationCycleLimits)
        {
            DGRoomClass newRoom = GenerateRandomRoom();
            //проверяем, пересекается ли комната с уже созданными
            if (!newRoom.IsTooSmall(coridorThicknes) && !newRoom.IsIntersect(rooms))
            {
                rooms.Add(newRoom);
                generatedRooms++;
            }
            else
            {
                genStep++;
            }
        }

        if (rooms.Count > 1)
        {//есть хотя бы две комнаты, строим коридоры
            //для каждой ищем ближайшую
            for (int i = 0; i < rooms.Count; i++)
            {
                //int j = GetRoomToRoomClosestIndex(i);
                int[] toRoomClostArray = GetRoomToRoomClosestIndexesArray(i);
                for (int j = 0; j < coridorsCount; j++)
                {
                    if (j < toRoomClostArray.Length)
                    {
                        int toRoomId = toRoomClostArray[j];
                        if (toRoomId != i && toRoomId > -1)
                        {
                            BuildCoridor(i, toRoomId);
                        }
                    }
                }
            }

            //дальше формируем матрицу с проходимостью
            DGPointPairClass minMax = GetMinMax();
            dgMap = new DGMap(minMax.point02.GetY() - minMax.point01.GetY(), minMax.point02.GetX() - minMax.point01.GetX(), minMax.point01, minMax.point02);
            foreach (DGRoomClass room in rooms)
            {
                dgMap.FillByRoom(room, false);
            }
            foreach (DGRoomClass coridor in coridors)
            {
                dgMap.FillByRoom(coridor, true);
            }
        }
    }
    public void FillByRoom(DGRoomClass room, bool isCoridor)
    {
        DGPointClass min = room.GetCorner(0);
        DGPointClass max = room.GetCorner(2);

        for (int i = maxPoint.GetY() - max.GetY(); i < maxPoint.GetY() - min.GetY(); i++)
        {
            for (int j = min.GetX() - minPoint.GetX(); j < max.GetX() - minPoint.GetX(); j++)
            {
                /*if(isCoridor)
                 * {
                 *  Debug.Log("Add to " + i.ToString() + " " + j.ToString());
                 * }*/
                map[i, j] = true;
            }
        }
    }
    public bool IsIntersect(DGRoomClass room)
    {
        //проверяем, лежат ли углы первой комнаты во второй, а потом углы вторй в первой. Если хотя бы один раз да - то есть пересечение
        if (IsPointInside(room.GetCorner(0)) || IsPointInside(room.GetCorner(1)) || IsPointInside(room.GetCorner(2)) || IsPointInside(room.GetCorner(3)) ||
            room.IsPointInside(cornerBL) || room.IsPointInside(cornerTL) || room.IsPointInside(cornerTR) || room.IsPointInside(cornerBR))
        {
            return(true);
        }
        //дальше проверяем, не накладываются ли они друг на друга. Для этого смотрим, центр второй комнаты должен лежать либо на горизоантали, либо на вертикали первой комнаты
        DGPointClass c = room.GetCenter();

        if ((c.GetX() >= cornerBL.GetX() && c.GetX() <= cornerBR.GetX() && center.GetY() >= room.GetCorner(0).GetY() && center.GetY() <= room.GetCorner(1).GetY()) ||
            (c.GetY() >= cornerBL.GetY() && c.GetY() <= cornerTL.GetY() && center.GetX() >= room.GetCorner(0).GetX() && center.GetX() <= room.GetCorner(3).GetX()))
        {
            return(true);
        }

        return(false);
    }
Beispiel #4
0
    void BuildCoridor(int startIndex, int endIndex)
    {
        DGRoomClass startRoom = rooms[startIndex];
        DGRoomClass endRoom   = rooms[endIndex];

        //выбрасываем у стартовой комнаты точку на вертикали, а у конечной - на горизоантали
        int sPos = startRoom.GetRandomVertical(coridorThicknes);
        int ePos = endRoom.GetRandomHorizontal(coridorThicknes);

        //теперь через sPos надо провести горизонталь, а через ePos вертикаль
        //надо найти к точке пересечений ближайшую вертикальную сторону у стартовой комнаты и ближайшую горизонтальную у конечной
        int clostV = startRoom.GetClosestVerticalCoordinate(ePos);
        int clostH = endRoom.GetClosestHorizontalCoordinate(sPos);

        DGRoomClass newCoridor01 = new DGRoomClass(new DGPointClass(clostV, sPos - coridorThicknes / 2), new DGPointClass(ePos + (Sign(ePos - clostV) > 0 ? coridorThicknes - coridorThicknes / 2 : -1 * coridorThicknes / 2), sPos - coridorThicknes / 2 + coridorThicknes));
        DGRoomClass newCoridor02 = new DGRoomClass(new DGPointClass(ePos - coridorThicknes / 2, clostH), new DGPointClass(ePos - coridorThicknes / 2 + coridorThicknes, sPos + (Sign(sPos - clostH) > 0 ? coridorThicknes - coridorThicknes / 2 : -1 * coridorThicknes / 2)));

        coridors.Add(newCoridor01);
        coridors.Add(newCoridor02);
    }
    public DGIntPairClass GetClosestCorners(DGRoomClass targetRoom)
    {
        DGIntPairClass toReturn = new DGIntPairClass();

        float[] distances = new float[16];
        distances[0] = cornerBL.GetDistance(targetRoom.GetCorner(0));
        distances[1] = cornerBL.GetDistance(targetRoom.GetCorner(1));
        distances[2] = cornerBL.GetDistance(targetRoom.GetCorner(2));
        distances[3] = cornerBL.GetDistance(targetRoom.GetCorner(3));

        distances[4] = cornerTL.GetDistance(targetRoom.GetCorner(0));
        distances[5] = cornerTL.GetDistance(targetRoom.GetCorner(1));
        distances[6] = cornerTL.GetDistance(targetRoom.GetCorner(2));
        distances[7] = cornerTL.GetDistance(targetRoom.GetCorner(3));

        distances[8]  = cornerTR.GetDistance(targetRoom.GetCorner(0));
        distances[9]  = cornerTR.GetDistance(targetRoom.GetCorner(1));
        distances[10] = cornerTR.GetDistance(targetRoom.GetCorner(2));
        distances[11] = cornerTR.GetDistance(targetRoom.GetCorner(3));

        distances[12] = cornerBR.GetDistance(targetRoom.GetCorner(0));
        distances[13] = cornerBR.GetDistance(targetRoom.GetCorner(1));
        distances[14] = cornerBR.GetDistance(targetRoom.GetCorner(2));
        distances[15] = cornerBR.GetDistance(targetRoom.GetCorner(3));

        //находим минимум
        float min = distances[0];

        for (int i = 1; i < 16; i++)
        {
            if (distances[i] < min)
            {
                min = distances[i];
                toReturn.value01 = i / 4;
                toReturn.value02 = i % 4;
            }
        }

        return(toReturn);
    }
Beispiel #6
0
    int GetRoomToRoomClosestIndex(int i)
    {
        float       closestDistance = 2 * dSize;
        DGRoomClass room            = rooms[i];
        int         closestIndex    = -1;

        for (int j = 0; j < rooms.Count; j++)
        {
            if (i != j)
            {
                //считаем расстояние от каждой вершины комнаты до каждой вершины j-ой комнаты и берем минимальное
                float d = room.GetCornerDistance(rooms[j]);
                if (d < closestDistance)
                {
                    closestDistance = d;
                    closestIndex    = j;
                }
            }
        }

        return(closestIndex);
    }
    public float GetCornerDistance(DGRoomClass room)
    {
        float[] distances = new float[16];
        distances[0] = cornerBL.GetDistance(room.GetCorner(0));
        distances[1] = cornerBL.GetDistance(room.GetCorner(1));
        distances[2] = cornerBL.GetDistance(room.GetCorner(2));
        distances[3] = cornerBL.GetDistance(room.GetCorner(3));

        distances[4] = cornerTL.GetDistance(room.GetCorner(0));
        distances[5] = cornerTL.GetDistance(room.GetCorner(1));
        distances[6] = cornerTL.GetDistance(room.GetCorner(2));
        distances[7] = cornerTL.GetDistance(room.GetCorner(3));

        distances[8]  = cornerTR.GetDistance(room.GetCorner(0));
        distances[9]  = cornerTR.GetDistance(room.GetCorner(1));
        distances[10] = cornerTR.GetDistance(room.GetCorner(2));
        distances[11] = cornerTR.GetDistance(room.GetCorner(3));

        distances[12] = cornerBR.GetDistance(room.GetCorner(0));
        distances[13] = cornerBR.GetDistance(room.GetCorner(1));
        distances[14] = cornerBR.GetDistance(room.GetCorner(2));
        distances[15] = cornerBR.GetDistance(room.GetCorner(3));

        //находим минимум
        float min = distances[0];

        for (int i = 1; i < 16; i++)
        {
            if (distances[i] < min)
            {
                min = distances[i];
            }
        }

        return(min);
    }