1
Général / Attribut d'une classe revient systématiquement à 0
« le: Avril 11, 2021, 04:16:06 pm »
Bonjour.
Je fais un petit programme qui comporte un bouton plus et un bouton moins dont le clic sur l'un d'eux modifie l'affichage d'une valeur en sf::text dans la fenêtre.
L'affichage est géré par une classe dont l'attribut 'position' est censé être modifié par les méthodes (setPositionPlus et setPositionMoins) des boutons plus et moins.
Mon problème c'est qu'après un click sur l'un des boutons, mon attribut position est remis à zéro et je ne sais pas pourquoi.
main.cpp :
Objet.h :
Objet.cpp :
case.h :
case.cpp :
Affichage.h :
Affichage.cpp :
Je fais un petit programme qui comporte un bouton plus et un bouton moins dont le clic sur l'un d'eux modifie l'affichage d'une valeur en sf::text dans la fenêtre.
L'affichage est géré par une classe dont l'attribut 'position' est censé être modifié par les méthodes (setPositionPlus et setPositionMoins) des boutons plus et moins.
Mon problème c'est qu'après un click sur l'un des boutons, mon attribut position est remis à zéro et je ne sais pas pourquoi.
main.cpp :
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Objet.h"
#include "Case.h"
#include "Affichage.h"
using namespace std;
bool select1 = false;
bool select2 = false;
bool debutProg = true;
bool lastClick = false;
void gestionCases(const sf::Window &target, Case &c1, Case &c2, Affichage &valAng);
int main()
{
sf::VideoMode videoMode(400, 300);
sf::RenderWindow window(videoMode, "Fenetre SFML");
while (window.isOpen())
{
sf::Event event;
Case case1(20, 20, '+');
Case case2(20, 60, '-');
if (debutProg)
{
case1.setSelect(select1);
case2.setSelect(select2);
debutProg = false;
}
Affichage valeurAngle(150, 150);
while (window.pollEvent(event))
{
if (event.type == sf::Event::EventType::Closed)
window.close();
}
window.clear();
gestionCases(window, case1, case2, valeurAngle);
valeurAngle.miseAjour();
case1.miseAjour();
case2.miseAjour();
valeurAngle.afficher(window);
case1.afficher(window);
case2.afficher(window);
window.display();
}
return 0;
}
void gestionCases(const sf::Window &target, Case &c1, Case &c2, Affichage &valAng)
{
sf::Vector2i position = sf::Mouse::getPosition(target);
bool click = (c1.estDansCase(position) || c2.estDansCase(position)) && sf::Mouse::isButtonPressed(sf::Mouse::Left);
if (click != lastClick)
{
if (click)
{
cout << "click" << endl;
if (c1.estDansCase(position))
{
valAng.setPositionPlus();
}
else if (c2.estDansCase(position))
{
valAng.setPositionMoins();
}
}
}
lastClick = click;
}
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Objet.h"
#include "Case.h"
#include "Affichage.h"
using namespace std;
bool select1 = false;
bool select2 = false;
bool debutProg = true;
bool lastClick = false;
void gestionCases(const sf::Window &target, Case &c1, Case &c2, Affichage &valAng);
int main()
{
sf::VideoMode videoMode(400, 300);
sf::RenderWindow window(videoMode, "Fenetre SFML");
while (window.isOpen())
{
sf::Event event;
Case case1(20, 20, '+');
Case case2(20, 60, '-');
if (debutProg)
{
case1.setSelect(select1);
case2.setSelect(select2);
debutProg = false;
}
Affichage valeurAngle(150, 150);
while (window.pollEvent(event))
{
if (event.type == sf::Event::EventType::Closed)
window.close();
}
window.clear();
gestionCases(window, case1, case2, valeurAngle);
valeurAngle.miseAjour();
case1.miseAjour();
case2.miseAjour();
valeurAngle.afficher(window);
case1.afficher(window);
case2.afficher(window);
window.display();
}
return 0;
}
void gestionCases(const sf::Window &target, Case &c1, Case &c2, Affichage &valAng)
{
sf::Vector2i position = sf::Mouse::getPosition(target);
bool click = (c1.estDansCase(position) || c2.estDansCase(position)) && sf::Mouse::isButtonPressed(sf::Mouse::Left);
if (click != lastClick)
{
if (click)
{
cout << "click" << endl;
if (c1.estDansCase(position))
{
valAng.setPositionPlus();
}
else if (c2.estDansCase(position))
{
valAng.setPositionMoins();
}
}
}
lastClick = click;
}
Objet.h :
#ifndef OBJET_H
#define OBJET_H
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class Case;
class Affichage;
class Objet
{
public:
Objet();
protected:
int Xpos;
int Ypos;
sf::Color couleur;
private:
};
#endif // OBJET_H
#define OBJET_H
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class Case;
class Affichage;
class Objet
{
public:
Objet();
protected:
int Xpos;
int Ypos;
sf::Color couleur;
private:
};
#endif // OBJET_H
Objet.cpp :
#include "Objet.h"
Objet::Objet()
{
}
Objet::Objet()
{
}
case.h :
#ifndef BOUTON_H
#define BOUTON_H
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "Objet.h"
class Case : public Objet
{
public:
Case();
Case(int posX, int posY);
Case(int posX, int posY, char label);
void afficher(sf::RenderTarget &target);
void miseAjour();
bool estDansCase(sf::Vector2i &pos);
bool getSelect();
void setSelect(bool &etat);
private:
sf::RectangleShape carre;
sf::Text texte;
sf::Font police;
char label;
int cote;
bool selectionne;
};
#endif // BOUTON_H
#define BOUTON_H
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "Objet.h"
class Case : public Objet
{
public:
Case();
Case(int posX, int posY);
Case(int posX, int posY, char label);
void afficher(sf::RenderTarget &target);
void miseAjour();
bool estDansCase(sf::Vector2i &pos);
bool getSelect();
void setSelect(bool &etat);
private:
sf::RectangleShape carre;
sf::Text texte;
sf::Font police;
char label;
int cote;
bool selectionne;
};
#endif // BOUTON_H
case.cpp :
#include "Case.h"
//#include <Font.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <math.h>
using namespace std;
Case::Case()
{
}
Case::Case(int posX, int posY)
{
Xpos = posX;
Ypos = posY;
cote = 40;
couleur = sf::Color::Black;
carre.setPosition(Xpos,Ypos);
carre.setSize(sf::Vector2f(cote,cote));
carre.setOutlineThickness(2);
carre.setOutlineColor(sf::Color::Red);
carre.setFillColor(couleur);
}
Case::Case(int posX, int posY, char label)
{
Xpos = posX;
Ypos = posY;
cote = 30;
couleur = sf::Color::Black;
carre.setPosition(Xpos,Ypos);
carre.setSize(sf::Vector2f(cote,cote));
carre.setOutlineThickness(2);
carre.setOutlineColor(sf::Color::Red);
carre.setFillColor(couleur);
if (!police.loadFromFile("arial.ttf"))
{
cout << "Erreur de chargement de police" << endl;
}
texte.setFont(police);
texte.setPosition(Xpos+(cote/3.5), Ypos);
texte.setString(label);
texte.setCharacterSize(24);
texte.setFillColor(sf::Color::Green);
}
void Case::afficher(sf::RenderTarget &target)
{
target.draw(carre);
target.draw(texte);
}
void Case::miseAjour()
{
}
bool Case::estDansCase(sf::Vector2i &pos)
{
sf::Vector2f posCarre = carre.getPosition();
return pos.x > posCarre.x && pos.x < (posCarre.x+cote) && pos.y > posCarre.y && pos.y < (posCarre.y+cote);
}
bool Case::getSelect()
{
return selectionne;
}
void Case::setSelect(bool &etat)
{
selectionne = etat;
}
//#include <Font.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <math.h>
using namespace std;
Case::Case()
{
}
Case::Case(int posX, int posY)
{
Xpos = posX;
Ypos = posY;
cote = 40;
couleur = sf::Color::Black;
carre.setPosition(Xpos,Ypos);
carre.setSize(sf::Vector2f(cote,cote));
carre.setOutlineThickness(2);
carre.setOutlineColor(sf::Color::Red);
carre.setFillColor(couleur);
}
Case::Case(int posX, int posY, char label)
{
Xpos = posX;
Ypos = posY;
cote = 30;
couleur = sf::Color::Black;
carre.setPosition(Xpos,Ypos);
carre.setSize(sf::Vector2f(cote,cote));
carre.setOutlineThickness(2);
carre.setOutlineColor(sf::Color::Red);
carre.setFillColor(couleur);
if (!police.loadFromFile("arial.ttf"))
{
cout << "Erreur de chargement de police" << endl;
}
texte.setFont(police);
texte.setPosition(Xpos+(cote/3.5), Ypos);
texte.setString(label);
texte.setCharacterSize(24);
texte.setFillColor(sf::Color::Green);
}
void Case::afficher(sf::RenderTarget &target)
{
target.draw(carre);
target.draw(texte);
}
void Case::miseAjour()
{
}
bool Case::estDansCase(sf::Vector2i &pos)
{
sf::Vector2f posCarre = carre.getPosition();
return pos.x > posCarre.x && pos.x < (posCarre.x+cote) && pos.y > posCarre.y && pos.y < (posCarre.y+cote);
}
bool Case::getSelect()
{
return selectionne;
}
void Case::setSelect(bool &etat)
{
selectionne = etat;
}
Affichage.h :
#ifndef RECEPTEUR_H
#define RECEPTEUR_H
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Objet.h"
class Affichage : public Objet
{
public:
Affichage();
Affichage(int posX, int posY);
void miseAjour();
void afficher(sf::RenderTarget &target);
void setPositionPlus();
void setPositionMoins();
private:
sf::Text texteAff;
sf::Font policeAff;
int position;
};
#endif // RECEPTEUR_H
#define RECEPTEUR_H
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Objet.h"
class Affichage : public Objet
{
public:
Affichage();
Affichage(int posX, int posY);
void miseAjour();
void afficher(sf::RenderTarget &target);
void setPositionPlus();
void setPositionMoins();
private:
sf::Text texteAff;
sf::Font policeAff;
int position;
};
#endif // RECEPTEUR_H
Affichage.cpp :
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "Affichage.h"
#include <iostream>
using namespace std;
Affichage::Affichage()
{
}
Affichage::Affichage(int posX, int posY)
{
Xpos = posX;
Ypos = posY;
position = 0;
string angleTxt(to_string(position));
if (!policeAff.loadFromFile("digi.ttf"))
{
cout << "Erreur de chargement de police" << endl;
}
texteAff.setFont(policeAff);
texteAff.setPosition(Xpos, Ypos);
texteAff.setString(angleTxt);
texteAff.setCharacterSize(24);
texteAff.setFillColor(sf::Color::White);
}
void Affichage::miseAjour()
{
std::string angleTxt(to_string(position));
texteAff.setString(angleTxt);
}
void Affichage::afficher(sf::RenderTarget &target)
{
target.draw(texteAff);
}
void Affichage::setPositionPlus()
{
position = position + 30;
cout << position << endl;
}
void Affichage::setPositionMoins()
{
position = position - 30;
cout << position << endl;
}
#include <SFML/Graphics.hpp>
#include "Affichage.h"
#include <iostream>
using namespace std;
Affichage::Affichage()
{
}
Affichage::Affichage(int posX, int posY)
{
Xpos = posX;
Ypos = posY;
position = 0;
string angleTxt(to_string(position));
if (!policeAff.loadFromFile("digi.ttf"))
{
cout << "Erreur de chargement de police" << endl;
}
texteAff.setFont(policeAff);
texteAff.setPosition(Xpos, Ypos);
texteAff.setString(angleTxt);
texteAff.setCharacterSize(24);
texteAff.setFillColor(sf::Color::White);
}
void Affichage::miseAjour()
{
std::string angleTxt(to_string(position));
texteAff.setString(angleTxt);
}
void Affichage::afficher(sf::RenderTarget &target)
{
target.draw(texteAff);
}
void Affichage::setPositionPlus()
{
position = position + 30;
cout << position << endl;
}
void Affichage::setPositionMoins()
{
position = position - 30;
cout << position << endl;
}