예제 #1
0
    private List <Tile> CreateCorridorRoom(BTConnection connection)
    {
        Tile        tile1 = connection.connectionTileA, tile2 = connection.connectionTileB;
        List <Tile> corridorRoom = new List <Tile>();

        Vector2 pos = new Vector2(tile1.tileX, tile1.tileY);

        int xDir = 0, yDir = 0;

        if (tile1.tileX <= tile2.tileX)
        {
            xDir = 1;
        }
        else
        {
            xDir = -1;
        }

        while (pos.x != tile2.tileX)
        {
            corridorRoom.Add(new Tile((int)pos.x, (int)pos.y));

            pos = new Vector2(pos.x + xDir, pos.y);
        }

        if (tile1.tileY <= tile2.tileY)
        {
            yDir = 1;
        }
        else
        {
            yDir = -1;
        }

        while (pos.y != tile2.tileY)
        {
            corridorRoom.Add(new Tile((int)pos.x, (int)pos.y));

            pos = new Vector2(pos.x, pos.y + yDir);
        }

        return(corridorRoom);
    }
예제 #2
0
    private BTConnection GetBestConnection(BTRoom room1, BTRoom room2, out int bestDistance)
    {
        List <BTConnection> connectionsBetweenRooms = new List <BTConnection>();

        bestDistance = -1;

        foreach (Tile t1 in room1.edgeTiles)
        {
            foreach (Tile t2 in room2.edgeTiles)
            {
                if (Math.Abs(t1.tileX - t2.tileX) > maxCorridorLengthX || Math.Abs(t1.tileY - t2.tileY) > maxCorridorLengthY)
                {
                    continue;
                }

                int distanceBetweenRooms = (int)(Mathf.Pow(t1.tileX - t2.tileX, 2) + Mathf.Pow(t1.tileY - t2.tileY, 2));

                if (bestDistance > distanceBetweenRooms || bestDistance == -1)
                {
                    bestDistance = distanceBetweenRooms;
                    connectionsBetweenRooms.Clear();
                    connectionsBetweenRooms.Add(new BTConnection(t1, t2, distanceBetweenRooms));
                }
                else if (bestDistance == distanceBetweenRooms)
                {
                    connectionsBetweenRooms.Add(new BTConnection(t1, t2, distanceBetweenRooms));
                }
            }
        }

        if (bestDistance != -1)
        {
            int          index      = pseudoRandom.Next(0, connectionsBetweenRooms.Count);
            BTConnection connection = connectionsBetweenRooms[index];
            return(connection);
        }

        return(null);
    }
예제 #3
0
    private List <BTRoom> ConnectRooms(BTNode node)
    {
        if (node.child1 == null && node.child2 == null)
        {
            return(node.area.rooms);
        }
        if (node.child1 == null)
        {
            List <BTRoom> roomComplex = ConnectRooms(node.child2);
            node.area.rooms.AddRange(roomComplex);
            return(node.area.rooms);
        }

        if (node.child2 == null)
        {
            List <BTRoom> roomComplex = ConnectRooms(node.child1);
            node.area.rooms.AddRange(roomComplex);
            return(node.area.rooms);
        }

        List <BTRoom> roomComplex1 = ConnectRooms(node.child1);
        List <BTRoom> roomComplex2 = ConnectRooms(node.child2);

        node.area.rooms.AddRange(roomComplex1);
        node.area.rooms.AddRange(roomComplex2);

        List <BTConnection> connectionsList = new List <BTConnection>();
        int bestDistance = -1;

        foreach (BTRoom room1 in roomComplex1)
        {
            BTConnection connectionBetweenRooms = null;
            foreach (BTRoom room2 in roomComplex2)
            {
                int          tmpBest;
                BTConnection tmpConnection = GetBestConnection(room1, room2, out tmpBest);

                if (tmpBest != -1 && (tmpBest < bestDistance || bestDistance == -1))
                {
                    bestDistance           = tmpBest;
                    connectionBetweenRooms = tmpConnection;
                }
            }

            if (connectionBetweenRooms != null)
            {
                connectionsList.Add(connectionBetweenRooms);
            }
            bestDistance = -1;
        }

        int depth             = GetTreeDepth(node);
        int connectionsAmount = pseudoRandom.Next(1 + depth / 3, 1 + depth / 2);

        for (int i = 0; i < connectionsAmount; i++)
        {
            if (connectionsList.Count == 0)
            {
                break;
            }

            int          index      = pseudoRandom.Next(0, connectionsList.Count);
            BTConnection connection = connectionsList[index];

            List <Tile> corridor = CreateCorridorRoom(connection);
            node.area.rooms.Add(new BTRoom(corridor));

            connectionsList.Remove(connection);
        }

        return(node.area.rooms);
    }