Bonjour.
Je crée un petit programme avec la SFML.
Le programme marche mais désormais je veux séparer les fonctions du fichier main.cpp dans des fichiers Fonctions.h et Fonctions.cpp, et là le compilateur me dit 'Multiple definition of'.
D'après ce que je trouve sur internet ce serait un problème de Directives de préprocesseur qui doit déclarer plusieurs fois ma variable à cause de mes #include.
Effectivement je déclare dans le 'main.cpp' et dans 'Fonctions.cpp' le même #include "Fonctions.h" ce qui doit être la source de mes ennuis car le compilateur doit comprendre que je déclare deux fois mes variables.
Auriez vous une solution.
main.cpp :
Objet.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include "Bouton.h" #include "Recepteur.h" #include "Objet.h" #include "Fonctions.h" #include <iostream> using namespace std; bool debutProg = true; int main() { sf::VideoMode videoMode(400, 300); sf::RenderWindow window(videoMode, "Fenetre SFML"); while (window.isOpen()) { sf::Event event; Bouton bouton1(100, 50, 10); Bouton bouton2(180, 50, 10); if (debutProg) { bouton1.setSelect(select); debutProg = false; } Recepteur recept1(50,100,50,50); while (window.pollEvent(event)) { if (event.type == sf::Event::EventType::Closed) window.close(); } window.clear(); gestionBoutons(window, bouton1, bouton2, recept1); bouton1.miseAjour(); bouton2.miseAjour(); bouton1.afficher(window); bouton2.afficher(window); recept1.afficher(window); window.display(); } return 0; }
Bouton.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #ifndef OBJET_H #define OBJET_H #include <SFML/Graphics.hpp> class Bouton; class Recepteur; class Objet { public: Objet(); protected: int Xpos; int Ypos; sf::Color couleur; private: }; #endif // OBJET_H
Bouton.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #ifndef BOUTON_H #define BOUTON_H #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include "Objet.h" #include "Recepteur.h" class Bouton : public Objet { public: Bouton(); Bouton(int posX, int posY, int ray); void afficher(sf::RenderTarget &target); void miseAjour(); bool estDansCercle(sf::Vector2i &pos); bool getSelect(); void setSelect(bool &etat); private: sf::CircleShape cercle; int rayon; bool selectionne; }; #endif // BOUTON_H
Recepteur.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include "Bouton.h" #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <iostream> #include <math.h> using namespace std; Bouton::Bouton() { } Bouton::Bouton(int posX, int posY, int ray) { couleur = sf::Color::White; rayon = ray; Xpos = posX; Ypos = posY; cercle.setRadius(rayon); cercle.setPosition(Xpos,Ypos); cercle.setFillColor(couleur); } void Bouton::afficher(sf::RenderTarget &target) { target.draw(cercle); } void Bouton::miseAjour() { if (selectionne) cercle.setFillColor(sf::Color::Green); else cercle.setFillColor(sf::Color::White); } bool Bouton::estDansCercle(sf::Vector2i &pos) { sf::Vector2f posCercle = cercle.getPosition(); sf::Vector2f centreCercle((posCercle.x + (cercle.getRadius())),(posCercle.y + (cercle.getRadius()))); int XdeplOrig = pos.x-centreCercle.x; int YdeplOrig = pos.y-centreCercle.y; int distOrigFenetre = sqrt((XdeplOrig*XdeplOrig)+(YdeplOrig*YdeplOrig)); return distOrigFenetre<cercle.getRadius(); } bool Bouton::getSelect() { return selectionne; } void Bouton::setSelect(bool &etat) { selectionne=etat; }
Recepteur.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef RECEPTEUR_H #define RECEPTEUR_H #include <SFML/Graphics.hpp> #include "Objet.h" class Recepteur : public Objet { public: Recepteur(); Recepteur(int posX, int posY, int larg, int haut); void afficher(sf::RenderTarget &target); void setCouleur(sf::Color coul); private: sf::RectangleShape rectangle; int largeur; int hauteur; }; #endif // RECEPTEUR_H
Fonctions.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include "Recepteur.h" #include <iostream> using namespace std; Recepteur::Recepteur() { } Recepteur::Recepteur(int posX, int posY, int larg, int haut) { Xpos = posX; Ypos = posY; largeur = larg; hauteur = haut; couleur = sf::Color::Blue; rectangle.setPosition(sf::Vector2f(Xpos, Ypos)); rectangle.setSize(sf::Vector2f(largeur, hauteur)); } void Recepteur::afficher(sf::RenderTarget &target) { rectangle.setFillColor(couleur); target.draw(rectangle); } void Recepteur::setCouleur(sf::Color coul) { couleur = coul; }
Fonctions.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #ifndef FONCTIONS_H_INCLUDED #define FONCTIONS_H_INCLUDED #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include "Bouton.h" #include "Recepteur.h" bool lastClick = false; bool select = true; void gestionBoutons(const sf::Window &target, Bouton &bout1, Bouton &bout2, Recepteur &rec1); #endif // FONCTIONS_H_INCLUDED
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include "Fonctions.h" #include <iostream> using namespace std; void gestionBoutons(const sf::Window &target, Bouton &bout1, Bouton &bout2, Recepteur &rec1) { sf::Vector2i position = sf::Mouse::getPosition(target); bool click = (bout1.estDansCercle(position) || bout2.estDansCercle(position)) && sf::Mouse::isButtonPressed(sf::Mouse::Left); if (click != lastClick) { if (click) { cout << "click" << endl; if (bout1.estDansCercle(position)) { select = true; bout1.setSelect(select); select = false; bout2.setSelect(select); } else if (bout2.estDansCercle(position)) { select = false; bout1.setSelect(select); select = true; bout2.setSelect(select); } } } lastClick = click; if (bout1.getSelect())rec1.setCouleur(sf::Color::Magenta); if (bout2.getSelect())rec1.setCouleur(sf::Color::Yellow); }
Partager