-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parc.cpp
173 lines (144 loc) · 7.02 KB
/
Parc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include "Parc.h"
#include <iomanip>
Parc::Parc(std::string nom) : Nom(nom), Attractions(), Visiteurs() {}
void Parc::AfficherDetails() const {
cout << "Nom : " << Nom << endl;
}
// Ajoute l'attraction à la liste des attractions du parc
void Parc::AjouterAttraction(const Attraction& attraction) {
Attractions.push_back(attraction);
}
//Méthode de simulation, elle gère l'affichage et met à jour les objets selon une boucle itérative
void Parc::simulerJournee(int heureOuverture, int heureFermeture, sf::RenderWindow& window) {
std::cout << "Simulation de la journée dans le parc de " << heureOuverture << "h à " << heureFermeture << "h\n";
// Création de l'horloge au moment du démarrage de la simulation de la journée
Horloge horloge(heureOuverture, heureFermeture);
horloge.start();
// Charger la police pour afficher le texte
sf::Font font;
if (!font.loadFromFile("Roboto-Regular.ttf")) {
// Gestion de l'erreur si le chargement de la police a échoué
std::cerr << "Erreur : impossible de charger la police Robot-Regular.ttf." << std::endl;
return;
}
// Espacement vertical et horizontal initial pour les textes des attractions
float verticalSpacing = 50.0f;
float horizontalSpacing = 10.0f;
// Définition de la taille des cases pour chaque attraction
const float caseWidth = 450.0f;
const float caseHeight = 75.0f;
// Utiliser la couleur violette foncée pour toutes les cases d'attraction
sf::Color purpleColor(75, 55, 164);
std::vector<sf::Color> colors(Attractions.size(), purpleColor);
// Indice de couleur pour chaque attraction
size_t colorIndex = 0;
// Créer une case pour afficher les actions du premier visiteur avec une couleur orange
sf::RectangleShape visitorActionsCase(sf::Vector2f(1300.0f, 70.0f));
visitorActionsCase.setFillColor(sf::Color(205, 81, 12));
visitorActionsCase.setOutlineColor(sf::Color::Black);
visitorActionsCase.setOutlineThickness(2);
visitorActionsCase.setPosition(10, 700);
// Créer un texte pour afficher les actions du premier visiteur
sf::Text visitorActionsText("", font, 18);
visitorActionsText.setPosition(visitorActionsCase.getPosition().x + 5, visitorActionsCase.getPosition().y + 5);
// Boucle pour afficher à chaque étape de la simulation avec SFML
while (horloge.estEnCours()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
// Définition de la couleur de fond pour l'affichage total
window.clear(sf::Color::White);
// Récupérer et afficher l'heure actuelle de l'horloge de simulation
int heure = horloge.getHeure();
int minute = horloge.getMinute();
//Création de la case
sf::RectangleShape timeCase(sf::Vector2f(200.0f, 50.0f));
timeCase.setFillColor(sf::Color(205, 81, 12));
timeCase.setOutlineColor(sf::Color::Black);
timeCase.setOutlineThickness(2);
timeCase.setPosition(10, 10);
window.draw(timeCase);
// Création du texte pour afficher l'heure
sf::Text timeText("Heure : " + std::to_string(heure) + "h" + std::to_string(minute), font, 30);
timeText.setPosition(15, 15);
window.draw(timeText);
// Définition de la position horizontale pour la première attraction de la liste
float startX = 10.0f;
// Afficher l'état de chaque attraction
int attractionsOnRow = 0;
for (auto& attraction : Attractions) {
attraction.AvancerTour(); // Faire avancer la files d'attente et estimer le nouveau temps d'attente
// Créer une case pour représenter la case de l'attraction
sf::RectangleShape attractionCase(sf::Vector2f(caseWidth, caseHeight));
attractionCase.setFillColor(colors[colorIndex % colors.size()]);
attractionCase.setOutlineColor(sf::Color::Black);
attractionCase.setOutlineThickness(2);
attractionCase.setPosition(startX, verticalSpacing);
window.draw(attractionCase);
// Créer un texte pour afficher le nom de l'attraction et le temps d'attente
sf::Text attractionText(attraction.GetNom() + " : " + std::to_string(attraction.TempsAttenteEstime()) + " min", font, 30);
// Calculer la position horizontale et verticale
float textPosX = startX + 15;
float textPosY = verticalSpacing + 5;
// Définir la position du texte
attractionText.setPosition(textPosX, textPosY);
// Ecrire le texte
window.draw(attractionText);
// Augmenter l'espacement horizontal pour la prochaine case
startX += caseWidth + 10.0f;
colorIndex++;
// Incrémenter le nombre d'attractions sur la ligne actuelle
attractionsOnRow++;
// Si on a atteint 3 attractions sur la ligne, passer à la ligne suivante
if (attractionsOnRow == 3) {
attractionsOnRow = 0;
verticalSpacing += caseHeight + 10.0f;
startX = 10.0f;
}
}
// Afficher les actions du premier visiteur pour montrer un exemple
window.draw(visitorActionsCase);
visitorActionsText.setString("Actions du premier visiteur : " + Visiteurs.front().GetActions());
visitorActionsText.setCharacterSize(30); // Augmenter la taille du texte
visitorActionsText.setPosition(visitorActionsCase.getPosition().x + 10, visitorActionsCase.getPosition().y + 10); // Ajuster la position du texte dans la case
window.draw(visitorActionsText);
// Mettre le logo
sf::Texture logoTexture;
if (!logoTexture.loadFromFile("Logo.png")) {
// Gérer l'erreur si le chargement de l'image a échoué
std::cerr << "Erreur : impossible de charger l'image du logo." << std::endl;
return;
}
sf::Sprite logoSprite(logoTexture);
float scaleFactor = 0.8f;
logoSprite.setScale(scaleFactor, scaleFactor);
float logoPosX = 10 + 3 * (caseWidth + 10) + 50;
float logoPosY = (window.getSize().y - logoTexture.getSize().y * scaleFactor) / 2.0f;
logoSprite.setPosition(logoPosX, logoPosY);
window.draw(logoSprite);
verticalSpacing = 50.0f;
// Mettre à jour l'affichage
window.display();
// Activer les visiteurs dans la simulation
for (auto& visiteur : Visiteurs) {
visiteur.ActiverVisiteur();
}
// Attendre une seconde pour l'affichage
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Fin de la journée dans le parc\n";
}
//Méthode pour libérer la mémoire allouée pour chaque visiteur
void Parc::LibérerVisiteurs() {
for (Attraction& attraction : Attractions) {
std::queue<Visiteur*>& fileAttente = attraction.GetFileAttente();
while (!fileAttente.empty()) {
Visiteur* visiteur = fileAttente.front();
delete visiteur;
fileAttente.pop();
}
}
}
Parc::~Parc() {}