Pertama-tama, ada banyak cara untuk melakukan generasi prosedural dan tidak ada yang mudah sama sekali, saya akan membuat semacam pendekatan bagaimana Anda bisa membuatnya bekerja, terserah Anda mengambilnya, memodifikasi atau membuangnya.
Akan pseudo-code di JS karena lebih mudah dimengerti.
1º menentukan titik masuk, karena Anda ingin membangun kota abad pertengahan, kita akan mulai dengan sebuah persegi, jadi katakanlah kota Anda akan memiliki 300 unit kuadrat dan alun-alun akan berada di tengahnya (diwakili dengan tanda X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º sekarang kita akan jalan, akan ada jumlah acak dari mereka, mereka akan lurus dan akan mulai dari alun-alun tengah atau dari jalan lain
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
Ini akan memberi Anda jalan utama persegi dan pasangan
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Sekarang kita harus mengatur jalan yang tidak dimulai di alun-alun, mereka akan memotong jalan lain
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] ];
}
Untuk mendapatkan vektor tegak lurus Anda harus menukar x, y cords dan meniadakan y baru:
swiped == x: noswiped.y, y: -1 * (noswiped.x)
Saat ini Anda harus memiliki sesuatu yang mirip dengan ini, bukankah itu terlihat seperti kota? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º sekarang Anda hanya perlu menghubungkan jalan dengan jalan-jalan pendek, juga, Anda dapat menelurkan kotak acak di sepanjang kota dan membuat yang sama seperti di atas untuk semuanya, atau hanya menelurkan jalan-jalan kecil dari beberapa kotak sekunder, terserah Anda.
Ingat, jalan terpendek Anda adalah, kekacauan kota terlihat seperti.