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

Auteur Sujet: Instancier un sf::Text  (Lu 3908 fois)

0 Membres et 1 Invité sur ce sujet

DYRAZZ

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Instancier un sf::Text
« le: Février 16, 2018, 11:33:35 pm »
Bonjour,
Lorsque je créé une classe avec un sf::Text en private, le compilo dit que tout est ok, mais lorsque le programme ce lance, RIP l'application et VS m'ouvre la classque boite de dialogue :
Exception levée à 0x00007FF890652C71 (sfml-graphics-d-2.dll) dans 2DGame.exe : 0xC0000005 : Violation d'accès lors de la lecture de l'emplacement 0xFFFFFFFFFFFFFFFF.

Voici l'exemple d'u code qui plante sous cette erreur.



//cpp
#include <SFML/Graphics.hpp>
#include "core.hpp"

int main() {
        sf::RenderWindow winMain(sf::VideoMode(1280, 720), "Test");
        CreateText textTest(25, "Yolo", sf::Color(50, 50, 50));
        while (winMain.isOpen()) {
                sf::Event event;
                winMain.pollEvent(event);
                while (winMain.pollEvent(event)) {
                        switch (event.type) {
                        case sf::Event::Closed:
                                winMain.close();
                                winMain.draw(textTest.drawText());
                                break;
                        }
                        winMain.clear();
                }
        }
}

//hpp
#ifndef CORE_HPP
#define CORE_HPP

class CreateText {
        public:
                CreateText(unsigned short size = 30, std::string strText = "", sf::Color tColor = sf::Color(255, 255, 255), unsigned short tTickness = 0, sf::Color tColorTick = sf::Color(255, 255, 255)) {
                        sf::Font temp;
                        temp.loadFromFile("C:/Users/dyraz.DYRAZZ/Desktop/Textures/fontGame.otf");
                        oText.setFont(temp);
                        oText.setCharacterSize(size);
                        oText.setFillColor(tColor);
                        oText.setOutlineThickness(tTickness);
                        oText.setOutlineColor(tColorTick);
                        oText.setString(strText);
                }

                sf::Text drawText() { return oText; }

        private:
                sf::Text oText;
};

#endif
[/font]

Cet exemple de code est bidon mais pourquoi le sf::Text ne peut pas être instancié ?
Merci d'avance
« Modifié: Février 21, 2018, 06:31:24 pm par DYRAZZ »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Instancier un sf::Text
« Réponse #1 le: Février 17, 2018, 08:35:07 am »
Utilise ton debugger et regarde plus précisément ce qui foire. Prend également garde à ne pas utiliser les libs SFML release en configuration Debug.
Laurent Gomila - SFML developer

DYRAZZ

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re: Instancier un sf::Text
« Réponse #2 le: Février 21, 2018, 06:30:35 pm »
J'ai regardé plus précisément et j'ai trouvé que dans le sf::Text instancié, le compilateur ne trouve pas la mémoire dans le répertoire

textTest | m_string | m_string | std::_String_alloc<std::_String_base_types<unsigned int,std::allocator<unsigned int> > > | _Mypair | [Affichage brut] | std::allocator<unsigned int> | _MyVal 2 | std::Container_base12 | _MyProxy | _Mycont | _Myproxy | _Myfirstiter
de _Myproxy et _Mynextiter où il dit qu'il ne peux pas lire la mémoire


Je ne suis qu'un débutant et je ne comprends pas grand chose :/


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Instancier un sf::Text
« Réponse #3 le: Février 21, 2018, 08:57:38 pm »
Tu es certain que la version de SFML que tu as téléchargée et ton compilateur correspondent exactement ?
Laurent Gomila - SFML developer

lelion

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re: Instancier un sf::Text
« Réponse #4 le: Mai 23, 2018, 09:12:20 pm »
Bonjour,

 J'ai moi aussi un problème avec sf::Text j'etais en train de creer un menu pour mon jeu coder sur VS et au moment de creer une sf::Font pour mon sf::Text, VS me donner plein d'erreur, j'ai essayer avec codeblocks et GCC sur mon pc portable pareil, j'ai enlever le SFML_STATIC et utiliser les librairies debug normal, ah ya plus d'erreur mais crash au lancement sans raison.
j'ai verifier ma version de SFML tout est bon, mais  j'ai quand même recompiler la Sfml avec cmake rien ne change ca plante... j'ai remarquer que si je parametrer mon sf:text dans ma fonction charger d'actualiser l'affichage juste avant le draw(text) ca fonctionner  :o du coup je me demander si y'avais pas un probleme avec ce sf:text et voila que je tombe sur ce topic. Du coup est ce que le code fournis Dyrazz fonctionne pour vous ?

sur VS en enlevant le mode static j'ai l'erreur "
Citer
(sfml-graphics-d-2.dll) dans test.exe : 0xC0000005 : Violation d'accès lors de la lecture de l'emplacement 0x0000000000000008.
" qui pointe vers le draw.

en mode SFML_STATIC (avec sfml-graphics-s-d ...)sur VS j'ai plein d'erreur de ce type:

Citer
1>sfml-graphics-s-d.lib(Font.cpp.obj) : error LNK2019: symbole externe non résolu FT_Init_FreeType référencé dans la fonction "public: bool __cdecl sf::Font::loadFromFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?loadFromFile@Font@sf@@QEAA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
...
...
« Modifié: Mai 23, 2018, 10:54:05 pm par lelion »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Instancier un sf::Text
« Réponse #5 le: Mai 24, 2018, 08:06:50 am »
Pour ce qui est des erreurs d'édition de liens, commence par lire le tutoriel de démarrage avec VC++ :)

Ensuite si ton code plante, poste un message avec des informations pertinentes (code complet minimal, ligne indiquée par le debugger, pile d'appels, ...).
Laurent Gomila - SFML developer

lelion

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re: Instancier un sf::Text
« Réponse #6 le: Mai 24, 2018, 01:32:00 pm »
Merci Laurent de prendre le temps de repondre  :-* oui pour le static j'avais oublier le freetype.lib et sinon j'ai trouver une solution qui "fonctionne" mais je ne comprend toujours pas pourquoi ca marche pas dans le premier cas, VS compile sans erreur ouvre une fenetre vide, et quand je la ferme j'ai un acces violation qui pointe vers xtree ligne 2096
Citer
_Nodeptr _Pnode = _Wherenode->_Parent;
    voici un code minimal qui explique ou j'en suis:

Header.h
Citer
#include <SFML/Graphics.hpp>

class CreateText1 //fonctionne pas
{
public:
   CreateText1(std::string strText = "",unsigned short size = 30)
   {
      sf::Font temp;
      temp.loadFromFile("font.TTF");
      oText.setFont(temp);
      oText.setCharacterSize(size);
      oText.setString(strText);
      oText.setPosition(200, 200);
   }

   sf::Text drawText() { return oText; }

private:
   sf::Text oText;
};

class CreateText2 //fcontionne
{
public:
   CreateText2(sf::String string, int size)
   {
      message = string; taille = size;
   }

   void draw_on(sf::RenderTarget &target)
   {
      sf::Text text;
      sf::Font font;
      font.loadFromFile("font.TTF");
      text.setCharacterSize(taille);
      text.setString(message);
      text.setPosition(200, 200);
      text.setStyle(sf::Text::Style::Bold);
      text.setFillColor(sf::Color::Red);
      text.setFont(font);
      target.draw(text);
   }

private:
   sf::String message;
   int taille;

};

Main.cpp
Citer
#include "Header.h"


int main()
{
   sf::RenderWindow window(sf::VideoMode(800, 600), "Text test!");
   CreateText2 textTest2("Salut laurent2", 30); //fonctionne
   CreateText1 textTest1("Salut laurent", 30); //fonctionne pas
   while (window.isOpen())
   {
      sf::Event event;
      while (window.pollEvent(event))
      {
         if (event.type == sf::Event::Closed)
            window.close();
      }

      window.clear();
      textTest2.draw_on(window); //fonctionne
      window.draw(textTest1.drawText()); //fonctionne pas
      window.display();
   }

   return 0;
}

« Modifié: Mai 24, 2018, 01:42:42 pm par lelion »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Instancier un sf::Text
« Réponse #7 le: Mai 24, 2018, 01:50:22 pm »
https://www.sfml-dev.org/documentation/2.5.0-fr/classsf_1_1Text.php#a2927805d1ae92d57f15034ea34756b81

En particulier :
Citer
The font argument refers to a font that must exist as long as the text uses it

A part ça, tu devrais apprendre à te servir de ton debugger. Il aurait pu te donner beaucoup plus de détails utiles sur ton erreur.
Laurent Gomila - SFML developer

lelion

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re: Instancier un sf::Text
« Réponse #8 le: Mai 24, 2018, 02:50:32 pm »
Oui Laurent, c'est vrai que j'ai du mal a comprendre, je marche par tatonnement, je test, retest, jusqu'a que ca marche puis j'essaye de comprendre pourquoi ca marche :D  et sinon j'ai trouver une solution parfaite pour ceux que je voulais faire, je me suis inspirer du code pour ceer des Tiles, ma classe text herite de  public sf::Drawable et j'ai creer cette fonction la en private
Citer
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
avec un
Citer
target.draw(text1);
a la fin et maintenant je peut faire un
Citer
window.draw(text1);
et surtout creer des pointeurs de text, les declarer ou je veux
etc problème résolut même si j'avoue ne pas tout comprendre, à cause de mon niveau d'anglais.

En gros mon erreur à etait de croire que la class sf::Text faisait deja ceux que je voulais faire, en fait j'ai du creer ma propre classe text qui prend tout les parametres requis et creer un sf:Text avec voila :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Instancier un sf::Text
« Réponse #9 le: Mai 24, 2018, 03:22:27 pm »
Alors au cas où c'était pas clair, l'erreur était que ton sf::Text utilisait (pointait vers) un sf::Font qui n'existait plus, car déclaré localement dans constructeur.
Laurent Gomila - SFML developer