Projet : étape 2.1
Lieu de vie

Buts: Mettre en place le lieu de vie des futurs animaux

Préambule

Il s'agit lors de cette étape d'aboutir à un premier programme graphique nous permettant de visualiser l'«environnement» simulé (classe Environment) et les différentes entités qui y évoluent au cours du temps (animaux, végétaux etc.).

Notre programme va désormais avoir pour composant essentiel une classe Application; le "noyau de simulation" capable de faire du graphisme et de gérer des événements, fourni dans src/Application.[hpp/cpp].

La classe Application joue le même rôle que la classe du même nom fournie dans le corrigé avancé du mini-projet graphique. Plus précisément, cette classe dispose  : C'est par le biais de l'attribut de type Environment que ce fait lien entre le noyau de simulation fourni et ce que vous codez. La classe Application dispose à ce propos d'une méthode handleEvent (ligne 468 de Application.cpp) qui permet à la simulation de réagir à des touches du clavier: par exemple la touche Esc permet de mettre fin à la simulation (fermeture de la fenêtre). Prenez note de l'existence de cette méthode pour la suite.

La classe Environment

La faune que nous allons simuler va évoluer dans un environnement. Il s'agit donc ici de commencer à modéliser de façon basique ce concept.

Une classe Environment va naturellement s'imposer ici. À ce stade nous considérerons qu'un environnement est caractérisé par :

Vous coderez la classe Environment dans le répertoire src/Environment.

Pour modéliser un ensemble d'animaux et de cibles, nous anticiperons un peu notre futur cours sur les structures de données. La notion de liste qui ne permet pas l'indexation aura l'avantage de permettre des insertions/suppressions d'éléments potentiellement moins coûteuses.

Exemple d'utilisation:

#include <list>
...
list<int> entiers; // ou list<int> entiers(3) ou list<int> entiers(3,1)
                   // avec la même signification que pour les constructeurs de vector

entiers.push_back(3); // insertion à la fin
entiers.push_front(2); // insertion au début
entiers.pop_front(); // suppression au début
entiers.pop_back();
Comme il n'y a pas d'indexation, le parcours d'une liste se fera au moyen d'itérations sur l'ensemble des valeurs :
for (auto animal: lesAnimaux)
ou
for (auto& animal: lesAnimaux)

Les méthodes suivantes sont à prévoir pour la classe Environment  :

Libre à vous par la suite d'ajouter toute autre méthode vous semblant utile.

[Question Q2.1] Quelles méthodes vous semble t-il judicieux de déclarer comme const?

[Question Q2.2] On souhaite ne pas permettre la copie d'un Environment. Quelle solution proposez-vous pour satisfaire cette contrainte ?

[Question Q2.3] La question Q2.2 suggère que chaque simulation s'intéressera à un environnement unique disposant de sa propre faune. Il ne fait par ailleurs pas beaucoup de sens de faire vivre les animaux sans les rattacher à un environnement. Un Environment peut donc être considéré comme responsable de la durée de vie des animaux amenés à être créés dans la simulation. Quelle incidence cela a t-il sur la destruction d'un environnement ?

Réfléchissez à ces questions et répondez-y dans votre fichier REPONSES et adaptez votre code en conséquence.

Test 2 : un environnement de base

Pour tester le travail fait jusqu'ici, vous utiliserez le test fourni dans src/Tests/GraphicalTests/EnvTest.cpp. La classe EnvTest hérite de Application. Elle dispose donc d'un environnement sur lequel seront invoquées en boucles les méthodes de dessin et de mise à jour que vous avez ébauchée. La touche R du clavier (gérée par Application::handleEvent) se traduit en fait par un appel à la méthode clean que vous venez de programmer.

cette classe redéfinit également la méthode onEvent de sorte à ce que la touche 'T' se traduise par un appel à la méthode addTarget que vous venez de programmer.

Le fichier CMakeLists.txt fourni permet de lancer la compilation du test par le biais de la cible envTest. N'oubliez pas de décommenter cette cible dans le fichier CMakeLists.txt (lignes 100, 101 et lignes les lignes 143, 144) et d'exécuter Build >Run Cmake lorsque vous êtes prêt à tester.

Le comportement de votre programme à ce stade devrait ressembler à ce qui est montré par cette petite vidéo (redémarrez-la au besoin) :

← Vous pouvez au moyen de la touche 'T' placer, à l'endroit où se trouve la souris, des cibles/ressources dans l'environnement.
Vérifiez que la touche 'R' vide l'environnement de toutes les cibles créées.
[Video : placement de cibles dans l'environnement]

Les touches utilisables par le programme sont documentées dans le petit menu d'aide qui apparaît dans la portion grise s'affichant à droite de la fenêtre de simulation.


Retour à l'énoncé du projet (partie 2) Module suivant (partie 2.2)