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

Auteur Sujet: SFML Gui (des questions pour tous, même aux débutants)  (Lu 3501 fois)

0 Membres et 1 Invité sur ce sujet

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
SFML Gui (des questions pour tous, même aux débutants)
« le: Janvier 23, 2013, 06:52:10 pm »
Salut, après avoir envoyé un mail à Laurent (qui est sans réponse), je pense qu'il doit être occuper pour ne pas y répondre. C'est pour quoi, je me redirige vers vous !

Voilà, j'ai du temps libre devant moi et j'aimerais me consacré à un projet qui puisse être utiles aux autres.
Et je me lance donc dans une Gui pour SFML (en reprenant comme base, ma Gui personnel)

J'aimerais terminer et mettre au point mon prototype (pour enfin, commencé à ma focaliser sur l'optimisation de celle-ci).

Donc voici la liste des questions (vous pouvez vous contenter de répondre à celles, dont vous avez envie) :

1) Cela vous dérangerait-il, si je passe à la norme C++11 ? (voir exemple)

// Constructeur
Button::Button() : Button("default text")
{
}

// Énumération
Policy::Expanding;

// ...
 

2) Qu'elle syntaxe désirez vous pour les signaux/slots ? Qu'elle syntaxe de signaux préférez-vous ? (voici les 2 syntaxe actuelle)

// Connexion (signal via énumération, converti en std::size_t)
button.connect(Button::Clicked, window, slot(&RenderWindow::close));
// Connexion (signal via std::string)
button.connect("clicked", window, slot(&RenderWindow::close));

// Émission de signal (exemple, depuis l'intérieur de la class Slider)
transmit(ValueChanged, m_value, valueOld);
transmit("valueChanged", m_value, valueOld); // valueOld, n'existe pas, et est là juste dans le but de montrer qu'on peut mettre plusieurs paramètre
 

Énumération (avantages)
==> Si on ne connaît pas le nom du signal, il suffis simplement de tapez le nom du widget:: et votre IDE affichera la liste des énumérations
==> Ne pèse qu'un simple std::size_t, donc plus performant qu'un string
String (avantages)
==> Rend le codage plus court

ps: je prévois déjà de renommer connect et de le rendre private, et de créer un nouveau connect qui sera templaté (je sais pas si ça se dit...?) et qui s'occupera d'appeler l'ancien connect
En résumer, on garde l'ancien avantage que connect ne soit pas templaté, mais juste la fonction d'appel et on gagne l'avantage de ne plus utiliser slot()
Ainsi on passe à :
button.connect("clicked", game, &Game::start);

ps2: le 2éme paramètre est soit une référence ou un pointeur de l'objet qui doit être exécuter

Voilà, donc si vous avez une idée pour rendre l'utilisation de signaux/slots plus simple et agréable, n'hésitez pas !

3) Préféreriez-vous que les signaux/slots soit automatiquement threadé ?

Je ne sais pas comment vous comptez utiliser vos signaux/slots, si la plus par du temps vous les utiliser pour des fonctions bloquante, il serait surement plus sage de les avoirs threadé par défaut.

4) Ce module de gui, risque d'avoir une dépendance en dehors de SFML, c'est l'utilisation d'une lib XML pour charger vos stylesheet où encore vos gui pré-crée. Donc la qu'elle préféreriez-vous ?

J'ai pensez à coder ma propre lecteur XML, ce qui devrait être assez rapide grâce aux regex...
Mais bon... c'est quand même perdre du temps et je doute que ce soit une sage idée ;D

5) Qu'elle syntaxe/structure utiliser pour le stylesheet ? Pouvez-vous m'aidez à en réaliser un qui soit Simple and Fast ? (c'est mon principal problème)

<?xml version="1.0" encoding="UTF-8"?>
<StyleSheet>

<Widget name="CheckBox|RadioButton" width="125" height="25">
        <Style name="Normal|NormalActive|NormalDisabled|Pressed|PressedActive|PressedDisabled">
                <Couche> <!-- La couche utilise par défaut un layout="honrizontal" -->
                        <LayoutV policyWidth="fixed">
                                <Image path="gui/frameLeftTop.png" />
                                <Image path="gui/frameLeftMiddle.png" />
                                <Image path="gui/frameLeftBottom.png" />
                        </LayoutV>
                        <LayoutV policyWidth="fixed">
                                <Image path="gui/frameMiddleTop.png" />
                                <Image path="gui/frameMiddleMiddle.png" />
                                <Image path="gui/frameMiddleBottom.png" />
                        </LayoutV>
                        <LayoutV policyWidth="fixed">
                                <Image path="gui/frameRightTop.png" />
                                <Image path="gui/frameRightMiddle.png" />
                                <Image path="gui/frameRightBottom.png" />
                        </LayoutV>
                        <Text>Case à cocher (le texte par défaut)</Text> <!-- Text du widget -->
                </Couche>
                <Couche name="Check" layout="float"> <!-- Cette couche n'est afficher que si on demande à afficher Check -->
                        <Image path="gui/check.png" size="25" policy="fixed" x="0" /> <!-- Centrer verticalement, en commencent à gauche -->
                </Couche>
        </Style>
</Widget>
<!-- Ce qui nous donne un cadre extensible en hauteur...
avec le check centrer dans le cadre...
et un texte à droite du cadre qui est extensible -->

</StyleSheet>

L'affichage de chaque widget doit impérativement être entièrement éditable depuis le stylesheet
Là tous à été simplifié, mais la création de style complet me paraît long avec ce système

Si vous avez des amélioration à proposer pour la syntaxe, j'attends avec impatience =)





Voici un exemple de ce que je vise pour mon prototype :
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Gui");

// Création du Gui Manager
sf::GuiManager gui;

// Chargement des stylesheet (via le constructeur)
sf::StyleSheet ssr("red.xml"), ssg("green.xml"), ssb("blue.xml");
ssg.becomeDefault(); // green devient le style par défaut (jusqu'à sa destruction)

// Chargement de l'interface graphique
gui.loadFromFile("ui.xml");

gui.getButton("red").setStyleSheet(ssr);   // On définie un style obligatoire
gui.getButton("green").setStyleSheet(ssg); // Si le bouton n'existe pas, GuiManager renvoie un faux
gui.getButton("blue").setStyleSheet(ssb);  // Et signal l'erreur sur le stream err

// Connexion des signaux/slots
gui.getButton("red").connect(sf::Button::Clicked, ssr, &sf::StyleSheet::becomeDefault);   // On change le style d'affichage
gui.getButton("green").connect(sf::Button::Clicked, ssg, &sf::StyleSheet::becomeDefault); // Au clic du bouton
gui.getButton("blue").connect(sf::Button::Clicked, ssb, &sf::StyleSheet::becomeDefault);
// Attention, le changement de style peut être plus ou moins long en fonction du nombre de widget
// Il est donc préférable de faire cela dans un thread

gui.getButton("exit").connect(sf::Button::Clicked, window, &sf::RenderWindow::close);

gui.getSlider("slider").connect(sf::Slider::ValueChanged, gui.getProgressBar("progress"), &sf::ProgressBar::setValue);

// Boucle d'affichage
while (window.isOpen())
{
    // Événement
    sf::Event event;
    while (window.pollEvent(event))
    {
        // Exit
        if (event.type == sf::Event::Closed)
            window.close();
        if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
            window.close();
        // Gui
        gui.event(event);
    }

    // Affichage
    window.clear(sf::Color::Black);
    window.draw(gui);
    window.display();
}

ps: je prévois de publier les sources une fois le stylesheet mis en place, (mais si vous avez besoin de consulter les sources ou juste de certaines class, vous pouvez me mp)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML Gui (des questions pour tous, même aux débutants)
« Réponse #1 le: Janvier 23, 2013, 07:04:53 pm »
Désolé je suis en vacances toute la semaine. Mais je ne crois pas avoir vu passer ton mail.
Laurent Gomila - SFML developer

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : SFML Gui (des questions pour tous, même aux débutants)
« Réponse #2 le: Janvier 23, 2013, 07:09:51 pm »
Il n'y a pas de soucis Laurent, le mail a été envoyé à "laurent (arobas) sfml-dev (point) org"
C'est un mail avec 11 questions

Je vais t'en faire une copie en MP sur le forum

 

anything