Ejemplo n.º 1
0
        void drawEntrancePath(Room room, List <Vector3> white)
        {
            var entrances = room.getCellsByAttribute(FaceTypes.ENTRANCE);

            foreach (Cell c in entrances)
            {
                white.Add(c.center);
            }
            var edgeMap = EdgeMap.constructEdgemapFromPoints(room.pointsInRoom);
            var edges   = GenerateMap.getDelaunayFromPoints(white).ToList();

            edges = new Prims().execute(edges).ToList();
            foreach (Edge e in edges)
            {
                var path = Dijkstras.ASTAR(edgeMap, e.v1, e.v2);
                for (int i = 0; i < path.Count - 1; i++)
                {
                    Debug.DrawLine(path[i], path[i + 1], Color.grey, float.PositiveInfinity, false);
                }
                white.AddRange(path);
            }
        }
Ejemplo n.º 2
0
		public HashSet<Room> roomGenerator  () {
			var watch = System.Diagnostics.Stopwatch.StartNew();
			var roomCenters = new HashSet<Vector3>();

			var rs = new List<Vector3>(requiredSpaces);
			
			
			totalPoints = new HashSet<Vector3>();
			for (int i = 0; i < width;i++){
				for (int j = 0; j < width;j++){
					for (int k = 0; k < height;k++){
						totalPoints.Add(new Vector3(i,j,k));
					}
				}
			}
			graph = EdgeMap.constructEdgemapFromPoints(totalPoints);
			var rects = new List<Rect>();
			
			int failsafe = 0;
			int roomCount = 0;
			while (roomCount< numberOfRooms || requiredSpaces.Count < 0){
				failsafe ++;
				if (failsafe > 100) {
					Debug.Log("overflow");
					break;
				}
				
				var v = new Vector3(random.Next(0,width),random.Next(0,width),0);
				Vector3 size = new Vector3(random.Next(minRoomLength,maxRoomLength),random.Next(minRoomLength,maxRoomLength),0);
				if (requiredSpaces.Count > 0){
					size = requiredSpaces[0];
				}
				
				
				
				var rect = new Rect(v,size);
				
				if (generateRoomHelper(ref roomCount,roomCenters,rect,rects,v)){
					requiredSpaces.Remove(size);

					int childCount = random.Next(minRoomChildCount,maxRoomChildCount);
					Rect current;
					for (int q = 0; q < childCount;q++){
						if (generateHypotheticalChildRoom(out current,rect,rects)){
							generateRoomHelper(ref roomCount,roomCenters,current,rects,rect.min);
						}
					}
				}				
			}
		

			var edges =(getDelaunayFromPoints(roomCenters)).ToList();
			var totalEdges = new HashSet<Edge>(edges);
			edges=  new HashSet<Edge>(new Prims().execute(edges)).ToList();
			foreach (Edge e in totalEdges){
				if (random.NextDouble() < .15 && ! edges.Contains(e)){
					edges.Add(e);
				}
			}
			var g = new EdgeMap(edges);

			foreach (Edge e in edges){	
				var points = paintRoomAroundLine(e,1,2);
				if (points.Count > 0){
					var r = new Room(points);
					r.tag = new BoundedSpaceTags(FaceTypes.HALLWAY);
					assignPointToRoom(r,false);
				}	
			}	
			
			var output = new HashSet<Room>(pointDict.Values);
			foreach (Room r in output){
				var r2 = Room.splitDisconnectedRoom(r);
				foreach (Room r3 in r2) assignPointToRoom(r3,true);
			}
			output.Clear();
			output.UnionWith(pointDict.Values);
			
			new RecursiveBackTrace().recursiveBackTrace(pointDict);

			return output;
		}