IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème avec la SFML


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Par défaut Problème avec la SFML
    Bonjour.
    Excusez moi si je me trompe de forum mais je crois que mon problème est de l'ordre du langage (et il n'y a pas la SFML dans les entraides sur les bibliothèques).
    J'essaie de modifier la couleur d'un rectangle en passant la souris sur un cercle en utilisant la SFML.
    C'est pour faire plus tard un bouton de sélection.
    J'ai créé un setter pour mettre mon rectangle en bleu et un autre pour le mettre en rouge, mais ça ne fait rien, j'ai mis dans ces setters des cout et dans la console ça agit bien.
    Auriez vous une petite idée du problème?

    main.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
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
     
    #include "Bouton.h"
    #include "Recepteur.h"
    #include "Objet.h"
     
    int main()
    {
        sf::VideoMode videoMode(400, 300);
        sf::RenderWindow window(videoMode, "Fenetre SFML");
     
        while (window.isOpen())
        {
            sf::Event event;
     
            Recepteur recept1(50,200,200,50,sf::Color::Yellow);
            Bouton bouton1(100, 50, 10, recept1);
     
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::EventType::Closed)
                    window.close();
            }
     
            window.clear();
     
            bouton1.miseAjour(window);
     
            recept1.afficher(window);
            bouton1.afficher(window);
     
            window.display();
        }
     
        return 0;
    }
    Objet.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
    #ifndef OBJET_H
    #define OBJET_H
     
    class Bouton;
    class Recepteur;
     
    class Objet
    {
        public:
            Objet();
     
        protected:
            int Xpos;
            int Ypos;
     
        private:
     
    };
     
    #endif // OBJET_H
    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
    24
    25
    #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, Recepteur &rec);
        void afficher(sf::RenderTarget &target);
        void miseAjour(const sf::Window &target);
        bool estDansCercle(sf::Vector2i &pos);
     
    private:
        sf::CircleShape cercle;
        int rayon;
        Recepteur recept;
    };
     
    #endif // BOUTON_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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #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, Recepteur &rec)
    {
            rayon = ray;
            Xpos=posX;
            Ypos=posY;
            cercle.setRadius(rayon);
            cercle.setPosition(Xpos,Ypos);
            cercle.setFillColor(sf::Color::White);
            recept = rec;
    }
     
    void Bouton::afficher(sf::RenderTarget &target)
    {
        target.draw(cercle);
    }
     
    void Bouton::miseAjour(const sf::Window &target)
    {
        sf::Vector2i position = sf::Mouse::getPosition(target);
     
        if (Bouton::estDansCercle(position)) recept.setCouleurBleue();
        else recept.setCouleurRouge();
    }
     
    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();
    }
    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
    #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, sf::Color coul);
            void afficher(sf::RenderTarget &target);
            void setCouleurBleue();
            void setCouleurRouge();
     
        private:
            sf::RectangleShape rectangle;
            int largeur;
            int hauteur;
            sf::Color couleur;
    };
     
    #endif // RECEPTEUR_H
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include "Recepteur.h"
     
    #include <iostream>
     
    using namespace std;
     
    Recepteur::Recepteur()
    {
     
    }
     
    Recepteur::Recepteur(int posX, int posY, int larg, int haut, sf::Color coul)
    {
        Xpos = posX;
        Ypos = posY;
        largeur = larg;
        hauteur = haut;
        couleur = coul;
        rectangle.setPosition(Xpos, Ypos);
        rectangle.setSize(sf::Vector2f(largeur, hauteur));
        rectangle.setFillColor(couleur);
    }
     
    void Recepteur::afficher(sf::RenderTarget &target)
    {
        rectangle.setFillColor(couleur);
        target.draw(rectangle);
    }
     
    void Recepteur::setCouleurBleue()
    {
        couleur = sf::Color::Blue;
        cout << "dedans" << endl;
    }
     
    void Recepteur::setCouleurRouge()
    {
        couleur = sf::Color::Red;
        cout << "dehors" << endl;
    }
    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Tes objets sont recréés à chaque frame.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Par défaut Problème de relations entre objets
    Bonjour.
    Je fais un petit programme avec la SFML.
    J'ai deux objets(Boutons) que je veux faire agir sur un recepteur(un rectangle), quand on passe la souris sur l'un des boutons le rectangle passe au bleu.
    Le problème c'est que il n'y a que le dernier objet qui agit sur le récepteur et pas le premier je ne sais pas pourquoi.


    main.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
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
     
    #include "Bouton.h"
    #include "Recepteur.h"
    #include "Objet.h"
     
    int main()
    {
        sf::VideoMode videoMode(400, 300);
        sf::RenderWindow window(videoMode, "Fenetre SFML");
     
        while (window.isOpen())
        {
            sf::Event event;
     
            Recepteur recept1(50,100,50,50);
     
            Bouton bouton1(100, 50, 10);
            Bouton bouton2(180, 50, 10);
     
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::EventType::Closed)
                    window.close();
            }
     
            window.clear();
     
            bouton1.miseAjour(window,recept1);
            bouton2.miseAjour(window,recept1);
     
            recept1.afficher(window);
     
            bouton1.afficher(window);
            bouton2.afficher(window);
     
     
            window.display();
        }
     
        return 0;
    }
    Objet.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
    #ifndef OBJET_H
    #define OBJET_H
     
    class Bouton;
    class Recepteur;
     
    class Objet
    {
        public:
            Objet();
     
        protected:
            int Xpos;
            int Ypos;
     
        private:
     
    };
     
    #endif // OBJET_H
    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
    24
    25
    26
    #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(const sf::Window &target, Recepteur &rec);
        bool estDansCercle(sf::Vector2i &pos);
     
    private:
        Recepteur recept;
        sf::CircleShape cercle;
        int rayon;
    };
     
    #endif // BOUTON_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
    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
    #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)
    {
            rayon = ray;
            Xpos = posX;
            Ypos = posY;
            cercle.setRadius(rayon);
            cercle.setPosition(Xpos,Ypos);
            cercle.setFillColor(sf::Color::White);
            //recept = rec;
    }
     
    void Bouton::afficher(sf::RenderTarget &target)
    {
        target.draw(cercle);
    }
     
    void Bouton::miseAjour(const sf::Window &target, Recepteur &rec)
    {
        sf::Vector2i position = sf::Mouse::getPosition(target);
     
        if (Bouton::estDansCercle(position))
        {
            rec.setCouleur(sf::Color::Blue);
        }
        else rec.setCouleur(sf::Color::Red);
    }
     
    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();
    }
    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
    #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;
            sf::Color couleur;
    };
     
    #endif // RECEPTEUR_H
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #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;
        rectangle.setPosition(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;
    }
    Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            bouton1.miseAjour(window,recept1);
            bouton2.miseAjour(window,recept1);
    Et cette fonction fait...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if (Bouton::estDansCercle(position))
        {
            rec.setCouleur(sf::Color::Blue);
        }
        else rec.setCouleur(sf::Color::Red);
    Donc oui une simple lecture montre que bouton1 aura aucun effet puisque bouton2 va forcément appliquer un truc.

    Ton code est mauvais.
    Un élément ça se crée puis s'utilise. Ça se recrée pas à chaque frame.
    Entre autre si tu espères garder un état d'une frame à l'autre.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'animation avec la sfml
    Par anate_far_ dans le forum Dev-C++
    Réponses: 0
    Dernier message: 17/04/2020, 19h00
  2. [SFML] Problème avec affichage en thread
    Par black is beautiful dans le forum SFML
    Réponses: 0
    Dernier message: 05/05/2009, 10h33
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo