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

Auteur Sujet: [Gui] CmGui  (Lu 3032 fois)

0 Membres et 1 Invité sur ce sujet

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
[Gui] CmGui
« le: Août 12, 2013, 07:21:28 pm »
Bonjour à tous !

Je présente rapidement un projet que j'ai commencé hier soir (le 11/08/13).
Donc mon but lorsque j'ai démarré ce projet était de réaliser principalement des Boutons
Avant je me compliquait la tâche en utilisant environ 10 lignes par bouton entre la texture, la sprite, la position, le textureRect, le BoundingRect, le texte à l'intérieur... et je ne vous parle pas de la gestion du survol et du clic...
Et je ne vous en parle même pas quand on arrive à un page avec plusieurs boutons...

Enfin bref, j'ai donc crée quelques classes afin de simplifier tout ça :)

Voici un exemple d'un fichier main.cpp :

#include <SFML/Graphics.hpp>
#include "include/Application.h"

int main()
{
    Application app;

    BoutonText bouton = app.newBoutonText(app.getTexture("gui.png"),sf::IntRect(0,0,396,35),sf::IntRect(0,35,396,35),sf::IntRect(0,70,396,35),sf::Vector2f(0,0),4,10,"Clique pour centrer",23,app.getFont("cloister.ttf"),sf::Color(255,255,255));
    BoutonImage boutonI = app.newBoutonImage(app.getTexture("gui.png"),sf::IntRect(0,0,396,35),sf::IntRect(0,35,396,35),sf::IntRect(0,70,396,35),sf::Vector2f(50,50),4,10,app.getTexture("gui.png"),sf::IntRect(0,70,180,10));

    while (app.isOpen()) //Application::isOpen inclut les fonctions display, clear et drawGui
    {
        while (app.pollEvent()) //Application::pollEvent inclut la gestion de la fermeture de la fenêtre
        {
            if (CmEvent::clicLeft(app.getEvent()) && bouton.isHover(app.getWindowPtr()))
            {
                bouton.centerText("Bim! Centré!");
            }
            if (CmEvent::clicLeft(app.getEvent()) && boutonI.isHover(app.getWindowPtr()))
            {
                boutonI.centerImage();
            }
        }
    }
    return 0;
}
 

Comment ça marche :

Je crée mon Application qui contient donc la fenêtre et un CmGui (GuiManager). Quand je crée un bouton je le crée depuis la méthode de l'Application car elle me retourne le bouton mais ajoute aussi un pointeur vers celui-ci dans un tableau. Quand j'appelle ma fonction drawGui, les boutons testent le survol et s'affichent.

Donc j'explique certains de mes choix que vous pouvez trouver bizarre ou peu adapter :

- Passer la RenderWindow en pointeur à certaines fonctions : Je me sert habituellement beaucoup des pointeurs sur les Window dans des applications plus conséquentes, voilà pour ce choix.

- Le grand nombre d'argument pour créer un bouton : Je préfère mettre tous les paramètres d'un coup même si cela et un peu galère mais au moins c'est fait en une ligne et une fois que cette ligne est bien on est tranquille :)

Liste des classes :

- Application : Contient le CmGui et une RenderWindow
- ResourceManager : Stocke les Textures, Fonts, et SoundBuffers afin de ne les charger qu'une seule fois et d'y accèder facilement.
- CmGui : Classe qui gère un paquet de GuiObject pour l'affichage ou le survol
- GuiObject : Classe mère de tous les objets (Bouton,BoutonText,BoutonImage)
- Bouton : Hérite de GuiObject, classe mère de BoutonText et BoutonImage, affiche un bouton vide
- BoutonText : Hérite de Bouton, et rajoute un texte à l'intérieur du bouton
- BoutonImage : Hérite de Bouton, et rajoute une image à l'intérieur du bouton
- CmEvent : Hérite de sf::Event, peu utile je l'avoue mais reste pratique avec ses fonctions static pour les test des clic (un peu plus lisible)

Sources : http://charles.mailly.free.fr/CmGui.rar

Pourquoi poster quelques choses de pas fini, incomplet, et pas optimisé ?

En présentant mon "projet" je cherche à avoir des avis différents, de gens sûrement plus expérimenté que moi mais aussi des idées nouvelles, des améliorations....

Futur :

- Un constructeur Bouton() qui permet de définir des Boutons par défaut
- Un fichier (XML ou autres) afin de définir les propriétés d'un bouton dedans
- Rajouter des méthodes de manipulation pour les boutons
- Rajouter d'autres GuiObjects :
    - Zone de texte
    - Fond d'écran
    - HUD
- Réglé quelques bugs et optimiser au maximum :)

Voilà, je vous remercie d'avoir pris le temps de me lire, et je vous remercie d'avance pour vos idées d'améliorations et commentaires :)

PS : Ah oui aussi, je savais vraiment pas quoi prendre comme nom donc j'ai copié sur CEGUI en mettant mes initiales xD

« Modifié: Août 13, 2013, 12:38:28 pm par Cmdu76 »

Akrotrili

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
    • Bonjour
Re : [Gui] CmGui
« Réponse #1 le: Août 12, 2013, 09:45:05 pm »
Le plus simple pour faire des boutons ça reste d'avoir une image toute prête, et une autre image pour le survol si besoin. :)

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : [Gui] CmGui
« Réponse #2 le: Août 12, 2013, 10:01:00 pm »
Je suis d'accord mais ici tu les crées rapidement et tu les dessines facilement => Simple and Fast :)

Nan enfin sérieusement, je trouve que c'est plus complet et ça va faciliter ma façon de faire et donc je le partage au cas où :)

Et oui, même dans le cas où tu affiches directement une image, la classe Bouton est beaucoup plus simple :)

C'est aussi vachement plus simple quand tu as plusieurs boutons, ici tu ne te galères pas à les gérer un par un, car certaines actions sont groupées, mais tu peux quand même manipuler tes boutons un par un si tu le désires.

Edit : Bop ! Je viens d'ajouter un systeme de gestion des ressources et l'activation/désactivation des objets ainsi qu'une classe Application qui comprends la RenderWindow et le ResourceManager! Je l'uploaderai peut-être demain :)

Edit : Je vais refaire un Edit de la présentation car ce que je viens de faire simplifie vraiment encore plus le truc xD
« Modifié: Août 12, 2013, 11:40:55 pm par Cmdu76 »