まず第一に、手続き生成を行う方法はたくさんありますが、どれも簡単なものではありません。
理解しやすいため、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ºこれで、通りを短い通りと相互接続するだけでよく、また、町中にランダムな正方形をスポーンし、それらすべてについて上記と同じようにするか、いくつかの二次的な正方形から小さな通りをスポーンできます。
覚えておいて、あなたの街が最短で、町が混chaとしているように見えます。