Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Attribut d'une classe revient systématiquement à 0  (Lu 1269 fois)

0 Membres et 1 Invité sur ce sujet

Mega76

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
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 :
#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;
}
 

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
 

Objet.cpp :
#include "Objet.h"

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
 

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;
}
 

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
 

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;
}