Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: lil6mon le Avril 19, 2020, 01:57:19 am

Titre: probleme debutant aves sf::Texte
Posté par: lil6mon le Avril 19, 2020, 01:57:19 am
Bonjour j'essai de creer un menu souris asser simple mais je n'arrive pas a afficher le texte de la class que j'ai faite, je pense que le probleme est dans le .cpp :
#include "menu.h"

icon::icon(sf::Vector2f position, sf::Vector2f size, std::string textString)
{
        font.loadFromFile("GoogleSans-Bold.ttf");
        name.setFont(font);
        name.setCharacterSize(24);
        name.setFillColor(sf::Color::Black);
        name.setPosition(position);
        name.setString(textString);
}

void icon::draw(sf::RenderWindow& window)
{
        window.draw(name);
}
 

le .h :
#ifndef MENU_H
#define MENU_H
#include <SFML/Graphics.hpp>
#include <string>

class icon{

        public:

                icon(sf::Vector2f position, sf::Vector2f size, std::string textString);

                void draw(sf::RenderWindow& window);

        protected:

                sf::Text name;
                sf::Font font;
};

#endif

la fenetre se ferme dans l'instant et on me parle de violation d'accès :/

merci pour votre aide.
Titre: Re: probleme debutant aves sf::Texte
Posté par: Laurent le Avril 19, 2020, 09:33:28 am
Utilise ton debugger, lui te dira précisément ce qui ne va pas.
Titre: Re: probleme debutant aves sf::Texte
Posté par: lil6mon le Avril 19, 2020, 12:11:13 pm
justement le programme se lance mais il s'arrête et le debugger indique une croix sur le "window.draw(name);" avec marqué  :  Exception levée à 0x7A0A49F8 (sfml-graphics-d-2.dll) dans Selective_evolution_system_V1.exe : 0xC0000005 : Violation d'accès lors de la lecture de l'emplacement 0xCDCDCDDA.

je ne comprends pas bien à quoi ce message corresponds (même après mes recherches).
je travail sur visual studio.
Titre: Re: probleme debutant aves sf::Texte
Posté par: Laurent le Avril 19, 2020, 03:45:56 pm
Le debugger t'a déjà donné beaucoup d'éléments : la ligne qui provoque l'erreur, et l'adresse mémoire 0xCDCDCDDA. 0xCDCDCDDA c'est en fait 0xCDCDCDCD avec un petit offset, et 0xCDCDCDCD c'est de la mémoire allouée dynamiquement mais non initialisée.

La cause du problème se trouve donc certainement en amont, il faut voir le code qui crée et utilise la classe icon.
Titre: Re: probleme debutant aves sf::Texte
Posté par: lil6mon le Avril 19, 2020, 04:51:28 pm
Oui je vois mais le fait est que je ne crois pas utiliser de pointer :
int main()
{
        std::vector<icon> allmenu; // position, size, text
        allmenu.push_back(icon(sf::Vector2f(5, 115), sf::Vector2f(200, 50), "Search..."));  //allmenu[0] search icon
        allmenu.push_back(icon(sf::Vector2f(5, 5), sf::Vector2f(200, 50), "1"));  //allmenu[1]  button anime 1
        allmenu.push_back(icon(sf::Vector2f(5, 60), sf::Vector2f(200, 50), "1000"));  //allmenu[2]  button anime 1000
        allmenu.push_back(icon(sf::Vector2f(5, 170), sf::Vector2f(200, 50), "animation"));  //allmenu[3]  button animate
       
        sf::RenderWindow window(sf::VideoMode(500, 500), "test");
        window.setKeyRepeatEnabled(false);
        while(window.isOpen())
        {
                window.clear(sf::Color::White);
                for (int i(0); i < allmenu.size(); i++)
                {
                        allmenu[i].draw(window);
                }
                window.display();
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                        {
                                window.close();
                        }
                }
        }

        return 0;
 

finalement j'ai reussi a le faire marcher en faisant :
void icon::draw(sf::RenderWindow& window)
{
        name.setFont(font);
        window.draw(name);
}
au lieu de :
void icon::draw(sf::RenderWindow& window)
{
        window.draw(name);
}

mais ca m'embete de ne pas savoir ce qui ne fonctionnait pas pour ne pas refaire l'erreur.
Titre: Re: probleme debutant aves sf::Texte
Posté par: Laurent le Avril 19, 2020, 06:30:02 pm
Tu stockes des copies d'instances de la classe "icon" dans ton vector. Et lors d'une copie, le sf::Text membre va être copié ainsi que le sf::Font membre. Mais le sf::Text va toujours "pointer" vers le sf::Font de l'instance originale, pas sa nouvelle copie. Et comme ce premier n'existe plus au moment de l'appel à draw... ça plante.

Ce n'est pas une bonne idée de stocker les ressources du genre texture, font, ... à cet endroit, car tu vas rapidement être sujet à ce genre de problème, et d'autre part tu te retrouves à charger et stocker plein de fois la même ressource, c'est du gaspillage de temps et de mémoire.

Charge ta police une fois, et passe la en paramètre à tes instances. Ou alors utilise un gestionnaire de ressources. Il y a plein de solutions ;)

Sinon, l'autre solution, c'est de considérer que tes instances sont des entités à part entière, et qu'elles ne doivent pas être copiées. Dans ce cas déclare les "non-copyable", alloue-les dynamiquement et stocke des pointeurs (intelligents) dans ton vector. Comme ça pas de duplications. Mais reste le problème du gaspillage de ressource.
Titre: Re: probleme debutant aves sf::Texte
Posté par: lil6mon le Avril 19, 2020, 06:33:17 pm
parfait je comprends mieux maintenant, merci pour votre aide.