Example #1
0
    DGPointPairClass GetMinMax()
    {
        DGPointPairClass toReturn = new DGPointPairClass();
        DGPointClass     rMin     = rooms[0].GetCorner(0);
        DGPointClass     rMax     = rooms[0].GetCorner(2);

        toReturn.point01 = new DGPointClass(rMin);
        toReturn.point02 = new DGPointClass(rMax);
        foreach (DGRoomClass room in rooms)
        {
            rMin = room.GetCorner(0);
            rMax = room.GetCorner(2);
            if (rMin.GetX() < toReturn.point01.GetX())
            {
                toReturn.point01.SetX(rMin.GetX());
            }
            if (rMin.GetY() < toReturn.point01.GetY())
            {
                toReturn.point01.SetY(rMin.GetY());
            }

            if (rMax.GetX() > toReturn.point02.GetX())
            {
                toReturn.point02.SetX(rMax.GetX());
            }
            if (rMax.GetY() > toReturn.point02.GetY())
            {
                toReturn.point02.SetY(rMax.GetY());
            }
        }

        foreach (DGRoomClass coridor in coridors)
        {
            rMin = coridor.GetCorner(0);
            rMax = coridor.GetCorner(2);
            if (rMin.GetX() < toReturn.point01.GetX())
            {
                toReturn.point01.SetX(rMin.GetX());
            }
            if (rMin.GetY() < toReturn.point01.GetY())
            {
                toReturn.point01.SetY(rMin.GetY());
            }

            if (rMax.GetX() > toReturn.point02.GetX())
            {
                toReturn.point02.SetX(rMax.GetX());
            }
            if (rMax.GetY() > toReturn.point02.GetY())
            {
                toReturn.point02.SetY(rMax.GetY());
            }
        }

        //Debug.Log("Minimum: " + toReturn.point01.ToString() + " Maximum: " + toReturn.point02.ToString());

        return(toReturn);
    }
Example #2
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);
            }
        }
    }