Directives de préprocesseur
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 :
Code:
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;
} |
Objet.cpp :
Code:
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.h :
Code:
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 |
Bouton.cpp :
Code:
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.h :
Code:
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 |
Recepteur.cpp :
Code:
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.h :
Code:
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 |
Fonctions.cpp :
Code:
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);
} |