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

Auteur Sujet: Faire un sprite clickable (Bouton)  (Lu 6696 fois)

0 Membres et 1 Invité sur ce sujet

Moongm

  • Invité
Faire un sprite clickable (Bouton)
« 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 :)

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Faire un sprite clickable (Bouton)
« Réponse #1 le: Août 12, 2016, 05:36:48 pm »
me voila avec ce problème
Lequel ?  :-\

Moongm

  • Invité
Re : Faire un sprite clickable (Bouton)
« Réponse #2 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 :/

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Faire un sprite clickable (Bouton)
« Réponse #3 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.

Moongm

  • Invité
Re : Faire un sprite clickable (Bouton)
« Réponse #4 le: Août 14, 2016, 01:42:31 pm »
Ha.. Ca ne marche peut-être pas car j'utilise pas sf::View ^^'

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Faire un sprite clickable (Bouton)
« Réponse #5 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é.

Moongm

  • Invité
Re : Faire un sprite clickable (Bouton)
« Réponse #6 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


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

 

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Faire un sprite clickable (Bouton)
« Réponse #7 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

Moongm

  • Invité
Re : Faire un sprite clickable (Bouton)
« Réponse #8 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;
}

SamFx06

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re: Faire un sprite clickable (Bouton)
« Réponse #9 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.