Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Moongm le Août 12, 2016, 05:21:07 pm

Titre: Faire un sprite clickable (Bouton)
Posté par: Moongm le Août 12, 2016, 05:21:07 pm
Bonjour, j'ai recemment un problème pour faire un bouton en utilisant la SFML.

Ce que je veux faire c'est essayé de faire du code pour faire en sorte que pour pouvoir afficher un bouton, une police, ou une texture par exemple, il suffit d'ajouter une ligne de code dans le programme. Pour l'instant c'est très mal codé car je suis débutant mais je compte arranger ça :). Donc du coup j'ai commencé par le bouton mais me voila avec ce problème.

Voici le code de la fonction de ma fenetre :

void WinConfig::whileGame() {

        while(m_window.isOpen())
        {
                sf::Event event;
                while(m_window.pollEvent(event))
                {
                        switch(event.type)
                        {
                                 case sf::Event::MouseButtonPressed:
                         if (buttonEnter.eventMouse(event.mouseButton.x,
                                event.mouseButton.y))
                         {
                                std::cout << "Test" << std::endl;
                         }

                         break;
                               
                                case sf::Event::Closed:
                                m_window.close();

                                default:
                                break;
                        }
                }


                m_window.clear(sf::Color::Black);

                m_component->draw(&m_window);

                m_window.display();
        }

}

C'est a l'endroit du case sf::Event::MouseButtonPressed:

Voici le code de la fonction eventMouse :

bool Button::eventMouse(int x, int y)
{
        sf::Vector2f point(x,y);
        sf::FloatRect boundingBox = m_spriteButton.getGlobalBounds();

        return boundingBox.contains(point);
}

Je vous remercie de votre aide :)
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: G. le Août 12, 2016, 05:36:48 pm
me voila avec ce problème
Lequel ?  :-\
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: Moongm le Août 12, 2016, 05:45:01 pm
De justement rendre mon bouton clickable. Quand j'appuies sur le sprite, rien ne se passe :/
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: G. le Août 13, 2016, 08:08:34 am
Ok.
Je vois à priori aucun problème dans la partie de code que tu as donnée.
Si ta vue (sf::View) a subi des transformations, pense à utiliser mapPixelToCoords (http://www.sfml-dev.org/tutorials/2.4/graphics-view-fr.php#conversions-de-coordonncees).
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: Moongm le Août 14, 2016, 01:42:31 pm
Ha.. Ca ne marche peut-être pas car j'utilise pas sf::View ^^'
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: G. le Août 14, 2016, 07:04:23 pm
Non, ça doit être autre chose, qu'on ne voit pas dans le morceau de code donné.
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: Moongm le Août 14, 2016, 08:45:55 pm
Dans ce cas voici la suite du code :
#include "Button.hpp"

Button::Button() {
        //NONE
}

Button::~Button() {
        //NONE
}

void Button::create(std::string id, int x, int y, sf::Texture * texture1) {
       
        m_spriteButton.setTexture(*(texture1));
        m_spriteButton.setPosition(x,y);
        m_idButton = id;
}

bool Button::eventMouse(int x, int y)
{
        sf::Vector2f point(x,y);
        sf::FloatRect boundingBox = m_spriteButton.getGlobalBounds();

        return boundingBox.contains(point);
}

sf::Sprite Button::retSprite() {
       
        return m_spriteButton;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "Component.hpp"

Component::Component() {

}

Component::~Component() {

}

void Component::create(ManagerGroup * ptr_managerGroup) {

        buttonEnter.create("buttonChangCode", 50, 80,
                ptr_managerGroup->ptr_textureManager->getTexture("changCode"));
}

void Component::draw(sf::RenderWindow * window) {

        window->draw(buttonEnter.retSprite());

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////


Button.hpp

#ifndef BUTTON_HPP
#define BUTTON_HPP

#include "ManagerGroup.hpp"

class Button {

public:

        Button();

        ~Button();

        void create(std::string id, int x, int y, sf::Texture * texture1);

        sf::Sprite retSprite();

        bool eventMouse(int x, int y);


private:

        sf::Sprite m_spriteButton;
        sf::Sprite m_spriteButton2;
        std::string m_idButton;


};

#endif //BUTTON_HPP


/////////////////////////////////////////////////////////////////////////////////////////////////////


WinConfig.hpp

#ifndef WIN_CONFIG_HPP
#define WIN_CONFIG_HPP

#include <SFML/Graphics.hpp>
#include "Component.hpp"

class WinConfig : public Component {

public:

        WinConfig(Component * component);

        ~WinConfig();

        void create();

        void whileGame();

private:

        sf::RenderWindow m_window;
        Component * m_component;

};

#endif //WIN_CONFIG_HPP


//////////////////////////////////////////////////////////////////////////////////////////////////////////µ


#ifndef COMPONENT_HPP
#define COMPONENT_HPP

#include "ComponentGroup.hpp"
#include "ManagerGroup.hpp"

class Component : public ComponentGroup {

public:

        Component();

        ~Component();

        void create(ManagerGroup * ptr_managerGroup);

        void draw(sf::RenderWindow * window);

protected:

        Button buttonEnter;

};
#endif //COMPONENT_HPP


/////////////////////////////////////////////////////////////////////////////////////////////

 
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: G. le Août 15, 2016, 08:37:13 pm
Désolé je vois rien de spécial, peut-être que je loupe un truc évident j'en sais rien. :/
Tu peux vérifier dans eventMouse que Point et BoundingBox contiennent bien ce qu'elles sont censées contenir
Titre: Re : Faire un sprite clickable (Bouton)
Posté par: Moongm le Août 15, 2016, 11:46:38 pm
Ha :/, pas de soucis.
Bah j'ai modifié le code pour faire des affichages :

WinConfig.cpp

case sf::Event::MouseButtonPressed:
                                 std::cout << "MouseButtonPressed !" << std::endl;
                         if(buttonEnter.eventMouse(m_window.mapPixelToCoords(
                                {event.mouseButton.x, event.mouseButton.y})))
                         {
                                std::cout << "Test" << std::endl;
                         }
                         break;


Button.cpp

bool Button::eventMouse(sf::Vector2f const &cursor_position)
{
        std::cout << "eventMouse" << std::endl;

        bool test = m_spriteButton.getGlobalBounds().contains(
        cursor_position.x,cursor_position.y);
       
        std::cout << test << std::endl;

        return test;
}
Titre: Re: Faire un sprite clickable (Bouton)
Posté par: SamFx06 le Septembre 08, 2017, 11:09:25 am
Au pire si tes bouton sont carrés tu test le clique de cette façon:
if(XMouse>XBouton&&XMouse<XBouton+XTailleBouton&&YMouse>YBouton&&YMouse<YBouton+YTailleBouton)
Et SFML a beau redimensionner l'affichage en même que la fenêtre,il ne fait pas pareil avec les coordonnés,c'est peut être aussi ça.