Prima di tutto, ci sono molti modi per fare generazione procedurale e nessuno di loro è affatto facile, farò il tipo di approccio a come potresti farlo funzionare, dipende da te prenderlo, modificarlo o scartarlo.
Pseudo-codice in JS poiché è più facile da capire.
1º definisci un punto di ingresso, poiché vuoi costruire una città medievale inizieremo con una piazza, quindi supponiamo che la tua città avrà 300 unità quadrate e la piazza sarà al centro di essa (rappresentata da una X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º ora saremo sui viali, ce ne sarà un numero casuale, saranno dritti e inizieranno dalla piazza centrale o da altri viali
let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square
for av in av_from_square
avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
// we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size
Questo dovrebbe darti una piazza e un paio di strade principali
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Ora dobbiamo impostare i viali che non iniziano nella piazza principale, si intersecano con gli altri viali
for av in (n_avenues - av_from_square){
const av_to_intersect = avenues[RANDOM(0,avenues.length)];
//check av_to... and get a perpendicular vector (explained bellow)
av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];
}
Per ottenere vettori perpendicolari devi scambiare i cavi x, y e annullare il nuovo y:
swiped == x: noswiped.y, y: -1 * (noswiped.x)
In questo momento dovresti avere qualcosa di simile a questo, non sembra una città? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º ora devi solo collegare i viali con strade brevi, inoltre, potresti generare casuali casuali in tutta la città e fare lo stesso come sopra per tutti loro, o semplicemente generare piccole strade da alcune piazze secondarie, dipende da te.
Ricorda, più brevi sono le tue strade, più caotica sembra la città.