Bonjour,
Dans le cadre de mon activité (micro-entreprise), je suis en train de développer un jeux vidéo, mais je me retrouve face à un problème : j'ai besoin d'un système GUI personnalisable et TGui ne fonctionne pas (API différente de la documentation et des tutos, résultat même impossible d'initialiser, bref).
Donc dans le cadre de mon projet, je suis en train de faire mon propre système GUI au niveau du jeu, et pour démarrer je m'attaque aux boutons (élément en général le plus simple).
Pour commencer le cadre :
J'ai une classe
Button héirtant de
sf::Drawable et
sf::Transformable. J'ai implémenté la méthode
draw.
Voilà le problème :
Le texte du bouton ne s'affiche pas, j'ai bien le cadre (sf::RectangleShape), mais pas le texte (sf::Text), j'ai juste un simple point et je ne comprends pas pourquoi.
Compléments d'informations :
Pour expliquer en gros ce que vous allez voir : j'ai une classe
RenderWindow qui est un
sf::RenderWindow. Le but étant, de gérer la boucle d'événement d'une façon différente. A savoir, que la boucle est directement gérée par mes différentes classes, car j'en ai une pour gérer les logos, une autre pour le menu (là où j'en suis ^^), et ainsi de suite.
Je ne veux donc pas avoir une super grosse boucle dans le main qui doit tout gérer et dont se sera le bordel intégral, donc ma RenderWindow me sert pour disposer d'une méthode permettant de déterminer si on doit stopper ou non la boucle.
Depuis cette RenderWindow, j'ai une classe Window qui en hérite et qui est le coeur de la gestion de ma fenêtre, avec une méthode
loop gérant une boucle de base (le while is_open), à partir de là, j'appel la boucle définie par la classe utilisant la fenêtre.
Voilà un peu pour le contexte de fonctionnement global. Donc là dans le code, j'ai deux textes : le premier qui est une instance de ma classe Button et qui ne fonctionne pas, et l'autre directement un sf::Text avec la même font et qui fonctionne.
Donc en premier le code appelant :
#include "Menu.h"
Menu::Menu(Window *window)
{
m_font.loadFromFile("assets/fonts/Roboto-Regular.ttf");
m_exitButton.setTextFont(m_font);
m_exitButton.setText("Coucou");
m_text.setString("Ttest");
m_text.setFillColor(sf::Color(255, 0, 0));
m_text.setFont(m_font);
window->loop([this](RenderWindow& win) { this->loop(win); });
}
Menu::~Menu()
{
//dtor
}
void Menu::loop(RenderWindow& window)
{
sf::Event event;
window.setRunningLoop(true);
while (window.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
//window.draw(m_text);
window.draw(m_exitButton);
window.display();
}
m_exutButton est un Button, dont voici le code :
#include "gui/Button.h"
Button::Button()
{
init();
}
Button::Button(sf::Font font)
{
m_text.setFont(font);
init();
}
void Button::init()
{
m_shape.setSize(sf::Vector2f(100,30));
m_shape.setFillColor(sf::Color(179, 179, 179));
m_text.setString("Button");
m_text.setFillColor(sf::Color(179, 179, 179));
m_text.setPosition(15, 15);
}
void Button::setTextSize(unsigned int size)
{
m_text.setCharacterSize(size);
}
void Button::setTextColor(const sf::Color color)
{
m_text.setFillColor(color);
}
void Button::setTextStyle(unsigned int style)
{
m_text.setStyle(style);
}
void Button::setText(sf::String text)
{
m_text.setString(text);
}
void Button::setTextFont(sf::Font font)
{
m_text.setFont(font);
}
void Button::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
//target.draw(m_shape, states);
target.draw(m_text, states);
}
Pour mes tests, j'ai désactivé le draw du cadre.
Et voici le résultat obtenu :
Comme on peut le constater, j'ai un simple point en blanc.alors qu'en plus je met du gris, comme s'il ignorait le setString et setFillColor en plus du setPosition d'ailleurs.
Merci d'avance pour votre aide.