Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Alexion le Juin 11, 2012, 09:03:41 pm

Titre: [Résolu] GUI pour SFML
Posté par: Alexion le Juin 11, 2012, 09:03:41 pm
Bonjour,

Je souhaiterais faire des boutons entièrement personnalisés (avec hover, etc) , j'ai essayé avec SFML mais c'est pas la gloire et c'est vraiment très hardcore. Je me demandais si je pourrais le faire avec SFGUI ou bien Qt ( avec lequel j'ai une bonne maitrise).

Merci de votre aide.

A bientôt
Titre: Re : GUI pour SFML
Posté par: Laurent le Juin 11, 2012, 09:33:32 pm
Qt non, il te faut un truc qui dessine sur une fenêtre SFML, donc soit avec SFML soit avec OpenGL.

SFGUI, très certainement oui.

Mais très honnêtement, s'il te faut juste des boutons c'est pas très hardcore. Deux sprites, une détection de la souris et c'est bon.
Titre: Re : GUI pour SFML
Posté par: Alexion le Juin 12, 2012, 06:26:28 am
Merci de ta réponse,

Ça fait plusieurs jour que je suis sur un bouton et le résultat est médiocre.
Tu peux aller jeter un œil ici (http://www.mediafire.com/download.php?2xfpxcoit513z52) . Il y a des bugs graphiques lors du survol de la souris sur le bouton Quit.

Merci de ton aide.
Titre: Re : GUI pour SFML
Posté par: pierreyoda le Juin 12, 2012, 03:36:34 pm
Ca c'est juste la "collision" avec la souris qui déconne, jette un coup d'oeil du côté de sf::Rect<T>::contains(x, y)   ;) (cf. doc)
Titre: Re : GUI pour SFML
Posté par: Alexion le Juin 12, 2012, 03:47:15 pm
Salut,
J'utilise déjà les IntRect, donc il faut que je fasse des conditions avec la fonction contains ?

Merci de ton aide.
Titre: Re : GUI pour SFML
Posté par: Cpl.Bator le Juin 12, 2012, 07:32:02 pm
C'est le b.a.-ba.

// test :
si contains() = vrai alors dedans = vrai sinon dedans = faux.

// affichage :
si dedans = vrai alors dessine dessin_survol
si dedans = faux alors dessine dessin_normal

Titre: Re : GUI pour SFML
Posté par: Alexion le Juin 12, 2012, 07:35:46 pm
C'est justement ce que je faisais mais sans les contains :

 if(mouseX < 150 && mouseY < 60 && !hover)
                    {
                        hover = true;
                    }
                    else if (hover)
                    {
                        hover = false;
                    }

 

Puis après le switch

        if(!hover)
            app.draw(spriteQuit1);
        if(hover)
            app.draw(spriteQuit2);
 

Je vais donc essayer avec les contains.

Merci de votre aide et j'espère que la doc de la 2.0 se développera rapidement  ;)

Titre: Re : [Résolu] GUI pour SFML
Posté par: Cpl.Bator le Juin 12, 2012, 08:44:30 pm
Citer
Merci de votre aide et j'espère que la doc de la 2.0 se développera rapidement

La doc est complète : http://www.sfml-dev.org/documentation/2.0/classes.php (http://www.sfml-dev.org/documentation/2.0/classes.php)
Titre: Re : [Résolu] GUI pour SFML
Posté par: Laurent le Juin 12, 2012, 10:09:51 pm
Je pense qu'il parle des tutoriels.
Titre: Re : [Résolu] GUI pour SFML
Posté par: Alexion le Juin 13, 2012, 06:25:23 am
Oui, je parlais des tutos.
Titre: Re : [Résolu] GUI pour SFML
Posté par: Macrob le Juin 21, 2012, 12:19:41 pm
Salut,

Même si le sujet est résolu, voici la méthode de hitTest que j'utilise :

bool hitTest(sf::FloatRect rect, sf::Vector2i mouse)
{
    if(mouse.x > rect.left)
    {
        if(mouse.x < rect.left + rect.width)
        {
            if(mouse.y > rect.top)
            {
                if(mouse.y < rect.top + rect.height)
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        else
            return false;
    }
    else
        return false;
}

Elle te sera peut être utile !  :)
Titre: Re : [Résolu] GUI pour SFML
Posté par: Laurent le Juin 21, 2012, 12:50:30 pm
Deux choses :

1. Beaucoup de lignes de code pour pas grand chose
bool hitTest(sf::FloatRect rect, sf::Vector2i mouse)
{
    return (mouse.x > rect.left) && (mouse.x < rect.left + rect.width) &&
           (mouse.y > rect.top)  && (mouse.y < rect.top + rect.height);
}

2. C'est très exactement ce que fait la fonction contains
if (rect.contains(mouse))
{
    ...
}

Note que FloatRect et Vector2i ne sont pas directement compatibles, mais de toute façon le fait que tu mixes les deux est une indication que tu fais mal quelque chose -- tu compares deux choses qui sont dans deux espaces différents (pixels pour les int, unités de la scène pour les float). Je pense que ce qu'il te manque, c'est un appel à window.convertCoords(mouse) pour passer des pixels à la scène.
Titre: Re : [Résolu] GUI pour SFML
Posté par: Macrob le Juin 21, 2012, 05:42:58 pm
Merci pour l'optimisation et la remarque  :)
Titre: Re : [Résolu] GUI pour SFML
Posté par: Bartours le Juin 29, 2012, 09:58:23 pm
Hello,

Je me permet de revenir sur le post initial et de l'idée de le faire avec Qt.

A l'époque j'avais testé un code donné sur le forum qui permettait d'intégrer un bouton Qt dans une fenêtre SFML.

Voici le lien :

http://www.sfml-dev.org/old-forum-fr/viewtopic.php?t=3641&postdays=0&postorder=asc&start=30

Entre temps, une première version de Qt5 (alpha) est sortie et je suis curieux de savoir quelles sont les possibilités concernant l'intégration avec SFML !

http://qt-project.org/wiki/Qt_5.0