Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Mega76

Pages: [1]
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 :
#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;
}
 


2
Graphique / Afficher un cercle à partir d'une classe
« le: Mars 22, 2021, 06:14:54 pm »
Bonjour.
J'essaie de me mettre à la SFML depuis peu.

Ce que je veux faire c'est afficher un cercle (pour faire un bouton plus tard) à partir d'une classe Bouton.

J'ai commencé un mini bout de code mais quand je compile j'ai un écran noir.


Je vous donne le code.

Main.cpp:
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

#include "Bouton.h"

int main()
{
    sf::VideoMode videoMode(400, 300);
    sf::RenderWindow window(videoMode, "Bonjour le monde !");

    while (window.isOpen())
    {
        sf::Event event;

        Bouton bouton1;  //<-- je crée mon bouton

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::EventType::Closed)
                window.close();
        }

        window.clear();

        bouton1.afficher(window); //<-- J'affiche le bouton (qui est un cercle)

        window.display();
    }

    return 0;
}


Bouton.h
#ifndef BOUTON_H
#define BOUTON_H

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>



class Bouton
{
public:
    Bouton();
    void afficher(sf::RenderTarget& target);

private:
    sf::CircleShape cercle;
};

#endif // BOUTON_H
 

Bouton.cpp:
#include "Bouton.h"
#include <SFML/Graphics.hpp>

#include <SFML/Window.hpp>

Bouton::Bouton()
{
        sf::CircleShape cercle(20);
        cercle.setPosition(sf::Vector2f(50, 130));
        cercle.setFillColor(sf::Color::Green);
}

void Bouton::afficher(sf::RenderTarget &target)
{
    target.draw(cercle);
}
 

Pages: [1]
anything