Ejemplo n.º 1
0
        private Room MakeRoom(int depth = 0)
        {
            if (depth > 5)
            {
                return(null);
            }

            int posX = (int)(rnd.NextFloat() * Fields.GetLength(0));
            int posY = (int)(rnd.NextFloat() * Fields.GetLength(1));

            MakeOdd(ref posX); // um sicherzustellen, dass das Feld oben links bei ungeraden Koordinaten liegt
            MakeOdd(ref posY);

            int sizeX = (int)(rnd.NextFloatGaussian(1) * Args.RoomSize.X);
            int sizeY = (int)(rnd.NextFloatGaussian(1) * Args.RoomSize.Y);

            MakeOdd(ref sizeX); // um sicherzustellen, dass der Raum ungerade Maße hat
            MakeOdd(ref sizeY);

            Field[] occFields = GetFields(posX, posY, sizeX, sizeY);
            if (occFields == null || occFields.Any(x => x.Area != null))
            {
                return(MakeRoom(depth + 1));
            }
            return(new Room(occFields, posX, posY, sizeX, sizeY));
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Erstellt anhand der in den DungeonGenArgs angegebenen Zahl pro Raum Gegner und platziert sie zufällig
 /// </summary>
 private void SpawnEnemies()
 {
     foreach (Room r in d.Rooms)
     {
         int enemyCount = (int)Math.Round((rnd.NextFloatGaussian(0.5f) + 0.5) * d.Args.EnemiesPerRoom);
         for (int i = 0; i < enemyCount; i++)
         {
             EntityEnemy enem = (EntityEnemy)rnd.PickElements(enemyTypes, 1)[0].GetConstructors()[0].Invoke(new object[] { d.Bounds }); // sucht einen Gegnertyp zufällig aus und erstellt ein Objekt dessen
             enem.Position = (new Vector(r.X, r.Y) + new Vector(r.SizeX * rnd.NextFloatGaussian(), r.SizeY * rnd.NextFloatGaussian()) / 2) * 16;
             entities.Add(enem);
         }
     }
 }