Ejemplo n.º 1
0
 public bool TryAddRoom(Room room)
 {
     if (!IntersectsExistingRooms(room))
     {
         _rooms.Add(room);
         GenerateTilesForRoom(room, _tiles, _tileDim);
         return true;
     }
     return false;
 }
Ejemplo n.º 2
0
        static void GenerateTilesForRoom(Room room, Tile[] ts, int tileDim)
        {
            int x = room.X;
            int y = room.Y;
            int w = room.W;
            int h = room.H;

            for (int xi = x; xi <= x + w; xi++)
            {
                for (int yi = y; yi <= y + h; yi++)
                {
                    int num = yi * tileDim + xi;
                    ts[num].Type = TileType.Room;
                }
            }
        }
Ejemplo n.º 3
0
 bool IntersectsExistingRooms(Room room)
 {
     // manual foreach is a lot faster than Any here
     foreach (var r in _rooms)
     {
         if (r.Intersects(room))
             return true;
     }
     return false;
 }
Ejemplo n.º 4
0
 public bool Intersects(Room otherRoom)
 {
     var roomDoesntIntersect =
         (X + W + 1) < otherRoom.X || X > (otherRoom.X + otherRoom.W + 1) ||
         (Y + H + 1) < otherRoom.Y || Y > (otherRoom.Y + otherRoom.H + 1);
     return !roomDoesntIntersect;
 }
Ejemplo n.º 5
0
        public IEnumerable<Level> MakeLevels(LevelSettings settings)
        {
            while(true)
            {
                var lev = new Level(settings.MaxRooms, settings.TileDim);

                int roomCount = 0;
                for (int attempt = 0; attempt < settings.RoomInsertionAttempts; attempt++)
                {
                    var x = _rand.Next() % settings.TileDim;
                    var y = _rand.Next() % settings.TileDim;
                    var w = _rand.Next() % settings.RestWidMax + settings.WidMin;
                    var h = _rand.Next() % settings.RestWidMax + settings.WidMin;

                    if (x + w >= settings.TileDim || y + h >= settings.TileDim || x == 0 || y == 0) continue;
                    var room = new Room{X=x, Y=y, W=w, H=h};
                    if (lev.TryAddRoom(room))
                    {
                        if (++roomCount == settings.MaxRooms)
                            break;
                    }
                }

                yield return lev;
            }
        }