Projet QUADTREE

GOLANG

Commençons !

Présentation du Projet

Pour ce projet, nous a été fourni un projet Go, plusieurs packages et répertoires que nous devions explorer et comprendre par nous-mêmes. Ce projet inclut un exécutable qui nous affiche une fenêtre avec un petit personnage animé sur un terrain composé de plusieurs textures.


Le but du projet était de comprendre la structure du code et d'y implémenter une génération de terrain en utilisant des Quadtree. Par la suite, nous devions également ajouter des extensions plus ou moins compliquées pour enrichir cette génération de terrain.

MakeFromArray

Quadtree Image

Voici le code pour implémenter une structure de données appelée Quadtree pour représenter un terrain en deux dimensions. L'idée est de diviser récursivement le terrain en sous-espaces plus petits jusqu'à ce que chaque zone soit homogène (c'est-à-dire que toutes les cases aient la même valeur) ou qu'elle atteigne la plus petite unité possible (1x1). Cette approche permet de maximiser l'efficacité et de réduire l'utilisation de la mémoire tout en optimisant les performances lors de la gestion de grandes surfaces. Le code ci-dessus crée un Quadtree à partir d'un tableau, génère les nœuds, et vérifie l'homogénéité des zones. Il gère également leur division automatique.

GetContent

Cette fonction permet de récupérer le contenu d'un Quadtree dans une matrice donnée. La méthode GetContent initialise d'abord la matrice en remplissant chaque élément avec -1. Ensuite, elle appelle la méthode récursive getContentRecursive pour parcourir le Quadtree et remplir la matrice avec les valeurs du terrain. La fonction prend en compte la position des nœuds et vérifie si chaque nœud est une feuille ou une division pour décider si elle doit insérer la valeur dans la matrice. Les fonctions auxiliaires min et max sont utilisées pour s'assurer que les indices de la matrice restent dans les limites de celle-ci lors de la mise à jour des valeurs des cases.

Quadtree Image

Génération aléatoire de terrain

Quadtree Image

Voici un code permettant de générer une matrice aléatoire contenant des chiffres de 0 à 7, basée sur les dimensions extraites d'un fichier texte. Le processus commence par récupérer les dimensions du terrain via la fonction getSize, puis une matrice de la taille correspondante est créée avec des valeurs aléatoires. Après cela, des transformations sont effectuées pour garantir que certaines zones soient accessibles et pour éviter que des cases d'eau ne soient générées autour du personnage (au centre de la matrice). Ce mécanisme permet de créer un terrain de jeu connecté et sans obstacles inaccessibles, tout en offrant une structure efficace pour gérer de grandes matrices.

Affichage du terrain amélioré

Cette fonction permet de dessiner le contenu du sol à l'écran en fonction de la matrice de terrain, en associant chaque numéro de la matrice à une texture spécifique à partir d'une image de tuiles. Le processus inclut également la gestion de la superposition d'herbe, qui est dessinée sur les tuiles où elle se trouve. La fonction getOverlayIndex détermine la texture d'herbe à superposer en fonction des cases voisines. Elle vérifie les cases autour de chaque tuile et décide quelle texture d'herbe appliquer en fonction de la présence de terrain autour (par exemple, herbe adjacente à d'autres types de terrain). Bien que cette solution fonctionne, elle n'est pas optimale, car elle nécessite de vérifier chaque combinaison possible de voisins pour chaque case, ce qui peut devenir très coûteux en performance pour de grandes cartes.

Quadtree Image

Génération de terrains sans blocages

Quadtree Image

Cette fonction assure la connectivité du terrain généré en garantissant que toutes les cases soient accessibles pour le joueur. Elle utilise une approche de recherche en largeur (BFS) pour explorer le terrain à partir d'un point de départ (le centre de la matrice) et marque les cases accessibles. Les cases inaccessibles sont alors transformées en eau (valeur 5). La fonction permet ainsi de générer des lacs et des océans en modifiant les zones isolées. De plus, une autre fonction complémentaire, ensureNoWaterAround, s'assure qu'il n'y ait pas d'eau autour du joueur lorsque celui-ci apparaît sur la carte, en transformant l'eau adjacente en herbe (valeur 0).

Réseau sociaux