Po pierwsze, istnieje wiele sposobów na generowanie procedur i żaden z nich wcale nie jest łatwy. Podejdę do tego, w jaki sposób możesz sprawić, by działał, od ciebie zależy, czy go zmodyfikujesz, czy odrzucisz.
Będzie pseudo-kod w JS, ponieważ jest łatwiejszy do zrozumienia.
1º zdefiniuj punkt wejścia, ponieważ chcesz zbudować średniowieczne miasto, zaczniemy od kwadratu, więc powiedzmy, że twoje miasto będzie miało 300 kwadratowych jednostek, a kwadrat będzie na środku (reprezentowany przez X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º teraz będziemy alejami, będzie ich losowa liczba, będą proste i zaczną się od środkowego kwadratu lub od innych alej
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
To powinno dać ci kwadrat i kilka głównych ulic
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Teraz musimy ustawić ścieżki, które nie zaczynają się na głównym placu, przecinają one inne ścieżki
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] ];
}
Aby uzyskać wektory prostopadłe, musisz zamienić kable x, y i zanegować nowy y:
przesunięty == x: noswiped.y, y: -1 * (noswiped.x)
Teraz powinieneś mieć coś podobnego do tego, czy to nie wygląda na miasto? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º teraz musisz tylko połączyć alejki z krótkimi uliczkami, możesz też odradzać losowe kwadraty w całym mieście i robić to samo jak wyżej dla wszystkich z nich, lub po prostu odradzać małe uliczki z niektórych zewnętrznych placów, to zależy od ciebie.
Pamiętaj, że najkrótsze są twoje ulice, chaotyczne miasto wygląda.