maandag 3 december 2012

Willekeurige levels en zo

Afgelopen week hebben we behoorlijk wat zaken afgehandeld. Zo hebben we vrijdag besloten dat we vóór aanstaande vrijdag een werkend prototype hebben waar we met z'n allen doorheen kunnen lopen. Lighting is helaas op een laag pitje gezet omdat Marries zei dat het nagenoeg onmogelijk is om +- 30 lichten met schaduwen te hebben, waar ik het ook een beetje mee eens ben, én het wordt niet van ons verwacht voor het komende jaar. Ik heb momenteel wel een ideetje om het te implementeren, maar dan moet de rest het daar ook mee eens zijn. Maargoed, op naar de random dungeon generation algorithm:

Random Dungeon Generation:
Oké, aan de hand van het artikel dat ik heb gelezen (bron) ben ik aan de slag gegaan. Het algoritme is eigenlijk vrij simpel:

  1. Maak een kamer in het midden met een willekeurige grootte
  2. pak een willekeurige muur en plaats daar een deur
  3. ga vanuit die deur een nieuwe kamer maken
  4. pak een willekeurige kamer
  5. pak een willekeurige muur en plaats daar een deur
  6. ga vanuit die deur een nieuwe kamer maken
  7. en ga zo maar door (herhaal stap 4-6 totdat we genoeg kamers hebben)
Dit gaf wel aardige resultaten, maar dit had als nadeel dat alle kamers naast elkaar zaten. Daarom heb ik er nog een paar regeltjes aan toegevoegd, namelijk dat we ook gangen kunnen maken (breedte 3, waarvan er 2 voor de muren zijn). Dus uiteindelijk is het als volgt geworden (r is een willekeurig getal tussen 0 en 1 van het type double (random.NextDouble())):
  1. Maak een kamer in het midden met een willekeurige grootte
  2. pak een willekeurige muur en plaats daar een deur
  3. ga vanuit die deur een:
    1. nieuwe kamer maken als r >= 1
    2. nieuwe gang maken als r < 1
  4. neem een willekeurige gang/kamer
  5. pak een willekeurige muur van die gang/kamer en plaats daar een deur
  6. als de gekozen kamer
    1. een kamer is
      1. maken we een nieuwe kamer als r >= 1
      2. maken we een nieuwe gang als r < 1
    2. een gang is
      1. maken we een nieuwe kamer als r >= 0
      2. maken we een nieuwe gang als r < 0
  7. herhaal stap 4-6 totdat we genoeg kamers hebben
Zoals te zien maken we altijd een kamer als we een gang hebben gekozen en maken we altijd een gang als we een kamer hebben gekozen. Echter, als we de '0' of de '1' aanpassen naar bijvoorbeeld '.25' en '.75' krijgen we geheel andere dungeons. Een paar voorbeelden (bruin is aarde, roodbruin is muur, groen is deur en wit is vloer):
Dit is een gegenereerde kaart met de volgende parameters: breedte: 300, hoogte: 400, aantal kamers: 20, breedte van een kamer: 5-10, hoogte van een kamer: 5-10.

Dit is een gegenereerde kaart met de volgende parameters: breedte: 100, hoogte: 100, aantal kamers: 300, breedte van een kamer: 5-10, hoogte van een kamer: 5-10
Nu rest dan eigenlijk alleen nog het probleem hoe we dit in de True3D engine van Vince toe gaan voegen. Na wat gehannes (wat eigenlijk reuze mee viel) heb ik het voor elkaar gekregen, en het resultaat mag er zijn vind ik. Persoonlijk denk ik dat het mooier is om aan het eind van een gang de kamer te maken in plaats van ergens in het midden en sowieso moet ik nog zorgen dat er tussen kamers een gang kan komen zodat er rondjes ontstaan, maar daar moet ik het nog even met anderen over hebben.

Dit is dus de gegenereerde dungeon, zoals te zien zijn er aardig wat doodlopende gangen. Hier kan misschien iets aan gedaan worden, maar het geeft ook wel iets meer spanning. Het enige nadeel is nu eigenlijk dat we als we in een kamer staan we de kamer ernaast ook kunnen zien. Rechtsonder zie je een geopende kist van Vince. Het resultaat mag er zijn :)
Dus dit was even een korte heads-up. Zoals het er nu naar uitziet kunnen we vrijdag inderdaad al een werkend prototype hebben. En het leuke is, de mogelijkheid tot First Person is er nog steeds, waar dit niet eens de bedoeling was! Dit gaan we hoogst waarschijnlijk niet toevoegen, maar misschien wel leuk om te doen als we een dungeon hebben uitgespeeld, dat we in first person door de dungeon bewegen hetzelfde pad als dat de speler heeft genomen.

I'm looking forward to it, and we're having a blast at it!
-Sander

Geen opmerkingen:

Een reactie posten