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.rarPourquoi 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