Перш за все, існує безліч способів зробити процедурне покоління, і жоден з них зовсім не простий, я буду робити такий підхід до того, як ви могли б змусити його працювати.
Чи буде псевдокод в JS, так як це легше зрозуміти.
1º визначте точку входу, оскільки ви хочете побудувати середньовічне місто, ми розпочнемо з площі, тому скажімо, що у вашого міста буде 300 квадратних одиниць, а площа буде посередині нього (представлена символом X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º зараз ми будемо проспекти, їх буде випадкове число, вони будуть прямими і почнуть із середнього квадрата або з інших проспектів
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
Це повинно дати вам площу та пару головних вулиць
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Тепер ми повинні встановити алеї, які не починаються на головній площі, вони перетинатимуть інші проспекти
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] ];
}
Для отримання перпендикулярних векторів вам потрібно поміняти місцями шнури x, y та заперечити нові y:
провела == x: noswiped.y, y: -1 * (noswiped.x)
Зараз у вас повинно бути щось подібне до цього, чи не схоже на місто? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º тепер вам потрібно лише з’єднати проспекти з короткими вулицями, ви також можете породити випадкові площі по всьому місту і зробити те ж, що вище для всіх, або просто породити невеликі вулички з деяких відокремлених площ.
Пам’ятайте, чим коротші ваші вулиці, тим хаотично виглядає місто.