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

Auteur Sujet: probleme debutant aves sf::Texte  (Lu 3214 fois)

0 Membres et 1 Invité sur ce sujet

lil6mon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
probleme debutant aves sf::Texte
« 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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: probleme debutant aves sf::Texte
« Réponse #1 le: Avril 19, 2020, 09:33:28 am »
Utilise ton debugger, lui te dira précisément ce qui ne va pas.
Laurent Gomila - SFML developer

lil6mon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re: probleme debutant aves sf::Texte
« Réponse #2 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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: probleme debutant aves sf::Texte
« Réponse #3 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.
Laurent Gomila - SFML developer

lil6mon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re: probleme debutant aves sf::Texte
« Réponse #4 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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: probleme debutant aves sf::Texte
« Réponse #5 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.
Laurent Gomila - SFML developer

lil6mon

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re: probleme debutant aves sf::Texte
« Réponse #6 le: Avril 19, 2020, 06:33:17 pm »
parfait je comprends mieux maintenant, merci pour votre aide.