Exemple #1
0
 private void DrawArea(BTArea area)
 {
     for (int x = area.btmLeft.tileX; x < area.btmLeft.tileX + area.width; x++)
     {
         for (int y = area.btmLeft.tileY; y < area.btmLeft.tileY + area.height; y++)
         {
             map[x, y] = 0;
         }
     }
 }
Exemple #2
0
    private void GenerateMap()
    {
        //Create new empty map
        map = new int[columns, rows];

        //Get random seed or use provided one
        if (useRandomSeed)
        {
            seed = Time.time.ToString();
        }
        pseudoRandom = new System.Random(seed.GetHashCode());

        //Fill map with 1(walls)
        for (int x = 0; x < columns; x++)
        {
            for (int y = 0; y < rows; y++)
            {
                map[x, y] = 1;
            }
        }

        //Create main area
        Tile   btmLeft  = new Tile(1, 1);
        BTArea mainArea = new BTArea(btmLeft, columns - 2, rows - 2);
        BTNode mainNode = new BTNode(mainArea);

        //Divide recursively main area into smaller ones
        DivideArea(mainNode);

        //Connect recursively all rooms
        ConnectRooms(mainNode);

        //Draw rooms - set
        DrawRooms(mainNode.area.rooms);
        mt = Time.realtimeSinceStartup;
    }
Exemple #3
0
 public BTNode(BTArea a, BTNode p)
 {
     area   = a;
     parent = p;
 }
Exemple #4
0
 public BTNode(BTArea a)
 {
     area   = a;
     parent = null;
 }
Exemple #5
0
    private void DivideArea(BTNode node)
    {
        int w = node.area.width;
        int h = node.area.height;
        int division; //1 means vertical, 0 means horizontal

        if (w < minAreaWidth)
        {
            if (h < minAreaHeight)
            {
                CreateRoom(node);
                return;
            }
            else
            {
                division = 0;
            }
        }
        else if (h < minAreaHeight)
        {
            division = 1;
        }
        else
        {
            division = pseudoRandom.Next(0, 2);
        }

        BTNode newLeaf1, newLeaf2;
        BTArea newArea1, newArea2;

        if (division == 0) // horizontal bisection
        {
            int lowend         = node.area.btmLeft.tileY + offset;
            int highend        = node.area.btmLeft.tileY + node.area.height - offset;
            int divisionHeight = pseudoRandom.Next(lowend, highend);

            newArea1 = new BTArea(node.area.btmLeft, node.area.width, divisionHeight - node.area.btmLeft.tileY);
            Tile newTile = new Tile(node.area.btmLeft.tileX, divisionHeight + 1);
            newArea2 = new BTArea(newTile, node.area.width, node.area.btmLeft.tileY + node.area.height - 1 - divisionHeight);

            newLeaf1 = new BTNode(newArea1, node);
            newLeaf2 = new BTNode(newArea2, node);
        }
        else // vertical bisection
        {
            int lowend        = node.area.btmLeft.tileX + offset;
            int highend       = node.area.btmLeft.tileX + node.area.width - offset;
            int divisionWidth = pseudoRandom.Next(lowend, highend);

            newArea1 = new BTArea(node.area.btmLeft, divisionWidth - node.area.btmLeft.tileX, node.area.height);
            Tile newTile = new Tile(divisionWidth + 1, node.area.btmLeft.tileY);
            newArea2 = new BTArea(newTile, node.area.btmLeft.tileX + node.area.width - 1 - divisionWidth, node.area.height);

            newLeaf1 = new BTNode(newArea1, node);
            newLeaf2 = new BTNode(newArea2, node);
        }

        node.child1 = newLeaf1;
        node.child2 = newLeaf2;

        DivideArea(newLeaf1);
        DivideArea(newLeaf2);
    }