420-4GP-BB / h24-tp3-2067247

h24-tp3-MalakFora created by GitHub Classroom
0 stars 0 forks source link

TP3: Générer la forêt #2

Closed 316k closed 6 months ago

316k commented 6 months ago

Dans la version actuelle, la forêt a été faite à la main en copiant-collant plein de Prefabs d'arbres. On pourrait plutôt créer la forêt avec du code.

On peut imaginer plusieurs algorithmes pour générer des arbres :

  1. Instancier des arbres alignés sur des rangées
  2. Instancier des arbres au hasard, en vérifiant qu'il y a assez d'espace entre chaque arbre
  3. Simuler une forêt créée au hasard: suivre des petites règles pour décider de quel arbre meurt et quel arbre naît pendant quelques générations, et instancier les arbres selon le résultat final

Ces choix doivent se retrouver dans le menu.

La forêt générée sur des rangées aurait l'air de ça :

Si on la génère au hasard, elle donnerait un résultat différent à chaque fois dans le style de :

Et finalement, avec la simulation de forêt, on obtiendrait encore un résultat au hasard mais avec des motifs semi-réalistes :

Précisions sur les Algorithmes

Arbres au hasard

Il ne doit pas y avoir deux arbres collés dans une forêt générée au hasard. Pour ce faire, vous pourriez commencer par choisir N positions au hasard, puis considérer ces positions une par une et supprimer les autres qui sont trop proches de celles-ci.

On vous déconseille fortement d'essayer d'utiliser les Collider pour ça, choisissez les positions avant d'Instanciate() les arbres.

La classe Rect pourrait vous aider à vérifier en 2D si deux arbres sont trop proches l'un de l'autre. Vous pourriez créer deux rectangles de la taille qu'un arbre prendrait et vérifier si arbre1.Overlaps(arbre2).

Forêt simulée

Pour simuler une forêt, on va utiliser un algorithme inspiré du Game of Life, qui est utilisé dans plusieurs jeux de type roguelike pour générer des dongeons au hasard.

On construit une grille 2D de bool (true = il y a un arbre, false = il n'y en a pas).

Chaque case est initialement choisie au hasard, avec 70% de chances d'être à true.

Pour obtenir la prochaine génération d'arbres, on crée un nouveau tableau 2D de bool et on applique la formule suivante sur chaque case :

Les voisins d'une case sont les cases en haut, bas, gauche, droite et les diagonales.

Pour obtenir un résultat intéressant, on devrait faire passer 10 générations d'arbres dans notre simulation. Ça devrait donner un tableau qui n'est ni trop plein ni trop vide.

Finalement, pour ajouter des arbres dans la scène, on prend la grille générée et on Instanciate() les arbres aux positions correspondantes aux cases à true seulement. Pour éviter que le résultat ne ressemble trop à une grille, on ajoute une valeur aléatoire à la coordonnée x et à la coordonnée z de l'arbre créé, choisies entre -1.25f et +1.25f. (Note: dans cet algorithme, les arbres peuvent finir assez proches l'un de l'autre à cause de cette valeur au hasard)

Exemple d'exécution de l'algo de simulation

Génération 0 (choisie au hasard)

| x |   | x |   | x |
| x | x | x | x |   |
|   | x | x | x |   |
|   | x | x | x |   |

Génération 1 (selon les formules)

|   |   | x |   |   |
| x | x | x |   | x |
|   | x | x |   | x |
|   | x |   | x |   |

Génération 2 (selon les formules)

|   |   |   |   |   |
|   |   | x |   |   |
|   | x | x |   |   |
|   |   |   |   |   |

Génération 3 (selon les formules)

|   |   |   |   |   |
|   | x |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |

Notes d'implémentation

Vous devez utiliser le patron Stratégie vu en classe. Faites-vous une hiérarchie de classes pour les différents algorithmes de génération de forêt.

Vous aurez probablement besoin de créer "plusieurs petites forêts", dans le sens où il sera probablement plus facile de découper la zone à remplir d'arbres en plusieurs petits rectangles et de générer des arbres dans chaque rectangle.