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

Auteur Sujet: [Résolu] Composant utilisant un sf::Drawable et sf::Transformable  (Lu 1957 fois)

0 Membres et 1 Invité sur ce sujet

christophedlr

  • Full Member
  • ***
  • Messages: 153
    • Voir le profil
    • E-mail
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.
« Modifié: Août 31, 2024, 09:56:09 am par christophedlr »

christophedlr

  • Full Member
  • ***
  • Messages: 153
    • Voir le profil
    • E-mail
Re: Composant utilisant un sf::Drawable et sf::Transformable
« Réponse #1 le: Août 31, 2024, 09:55:41 am »
Avec l'aide de ChatGPT en créant un projet vide pour les tests, j'ai résolu le soucis :
Il faut bien penser à passer le sf::Font en tant que référence, sinon effectivement on a un point blanc et c'est tout.