Tout d'abord, il existe de nombreuses façons de faire de la génération procédurale et aucune d'entre elles n'est facile du tout, je vais faire une sorte d'approche sur la façon dont vous pourriez le faire fonctionner, à vous de le prendre, de le modifier ou de le rejeter.
Sera pseudo-code dans JS car il est plus facile à comprendre.
1º définissez un point d'entrée, comme vous voulez construire une ville médiévale, nous allons commencer par un carré, alors disons que votre ville aura 300 unités carrées et que la place sera au milieu d'elle (représentée par un X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º maintenant nous allons les avenues, il y en aura un nombre aléatoire, elles seront droites et partiront de la place du milieu ou d'autres avenues
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
Cela devrait vous donner une place et quelques rues principales
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Maintenant, nous devons définir les avenues qui ne commencent pas sur la place principale, elles intersecteront les autres avenues
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] ];
}
Pour obtenir des vecteurs perpendiculaires, vous devez permuter les cordons x, y et annuler le nouveau y:
glissé == x: noswiped.y, y: -1 * (noswiped.x)
En ce moment, vous devriez avoir quelque chose de similaire à ça, ça ne ressemble pas à une ville? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º maintenant, il vous suffit d'interconnecter les avenues avec des rues courtes, vous pouvez également créer des carrés aléatoires tout au long de la ville et faire la même chose que ci-dessus pour chacun d'eux, ou simplement créer de petites rues à partir de certaines places secondaires, c'est à vous de décider.
N'oubliez pas que plus vos rues sont courtes, plus la ville est chaotique.