Schrijft al jaren over games, van de kleine indie-games tot de grote najaarstitels. Liefhebber van Dota 2, twijfelt nog over Destiny.
Een tijdje terug had ik het over procedurele generatie, zonder echt in te gaan op hoe ik het gebruik. Het was een inleiding, ik schreef wat je er allemaal mee kan. Deze keer ga ik het echter hebben over hoe ikzelf het gebruik. Hoe ik mijn random gegenereerde dungeons opbouw en welke stappen daarbij gezet moeten worden. Geen code, enkel logica.
De eerste stap is dat je moet weten wat je wilt. Mijn dungeons bestaan uit gangentjes die uitkomen in verschillende ruimtes. Zowel in de gangen als in de ruimtes moeten vijanden komen en er moet een begin- en eindpunt zijn. Als eerste vul ik een kamer met allemaal muren die zowel horizontaal als verticaal op elkaar aansluiten. Vervolgens plaats ik in het midden van deze ruimte een object dat zodra het in aanraking komt met een muur, die muur verwijderd. Elke verwijderde muur heeft een bepaalde kans om een vijand neer te zetten.
Nu laat ik de computer willekeurig bepalen in welke richting de eerste gang gaat, en uit hoeveel ‘stappen’ die gang bestaat, waarbij een stap gelijk staat aan een verwijderde muur. Zodra de laatste stap is gezet wordt weer opnieuw het aantal stappen en een richting bepaald, waarbij de kans dat hij zich 180 graden draait en terug de gang in loopt kleiner is dan de andere richtingen. Elke keer dat zo’n keerpunt wordt bereikt bestaat er de kans dat een ander object wordt geplaatst wat op die plek een open ruimte maakt.
Het aantal keer dat deze herhaling plaatsvindt wordt aan het begin ook willekeurig bepaald, zo krijg je de ene keer een kleine dungeon, terwijl de volgende keer het een enorm gangenstelsel oplevert.
Maar wat als dat object dat die gangen maakt de kamer uitloopt? Dat is inderdaad een probleem. Het beeld kan alleen binnen de kamer blijven, dus als de gang buiten de kamer zit kan de speler wel verder lopen, maar zal het beeld niet meer meebewegen. Daarom plaats ik aan de randen van de kamer speciale muren die ervoor zorgen dat het object zich omkeert.
Wanneer de laatste herhaling is voltooid zal het object zichzelf vernietigen en op die plek de speler neerzetten. De uitgang wordt geplaatst waar het object begon.
Dat is de basis, waarna er nog heel veel toevoegingen kunnen worden gedaan. Het programmeren hierachter is overigens niet eens zo heel moeilijk, wat basiskennis van if-, for-, en repeat-lussen en random functies en je bent er al!
In de dev-log artikelen vertel ik elke week hoe het vordert met de game waar ik aan het werken ben, of licht ik een technische of design kant van het maken van games toe.