우선, 절차 적 생성을 수행하는 방법에는 loooooot가 있으며 그중 어느 것도 전혀 쉽지 않습니다. 어떻게 작동시킬 수 있는지에 대한 접근 방식을 만들 것입니다. 수행, 수정 또는 폐기에 달려 있습니다.
이해하기 쉽기 때문에 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)
지금 당신은 이것과 비슷한 것을 가져야합니다. 도시처럼 보이지 않습니까? :피
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º는 이제 거리를 짧은 거리와 상호 연결하기 만하면됩니다. 또한 마을 전체에 임의의 사각형을 스폰하고 위와 동일하게 만들거나 일부 사각형에서 작은 거리를 스폰 할 수 있습니다.
거리가 가장 짧을수록 도시가 혼란스러워 보이는 것을 기억하십시오.