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; } } }
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; }
public BTNode(BTArea a, BTNode p) { area = a; parent = p; }
public BTNode(BTArea a) { area = a; parent = null; }
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); }