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

Auteur Sujet: Problème lors de l'utilisation de Sf::Text  (Lu 1920 fois)

0 Membres et 1 Invité sur ce sujet

selandron

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
    • E-mail
Problème lors de l'utilisation de Sf::Text
« le: Décembre 29, 2013, 01:55:29 pm »
Bonjour à tous!   :)

Je travaille actuellement sur un projet de jeu video pour le lycée (un RTS, si vous voulez savoir, mais le problème n'est pas là ^^), et je rencontre un problème lors de mon utilisation de sf::text dans l'écran de menu principal du jeu  :(

J'ai beau ne pas avoir d'erreur de compilation, cela fonctionne avec un code minimal (avec juste un main.cpp et quelques ligne de test pour tester le code qui semble poser problème)
Je pourrais simplement contourner le problème en utilisant des sprites sur lesquels j'appliquerais des textures où j'aurais déjà écris dessus les textes correspondant, mais cela poserais un probleme pour l'utilisation de fichier de langue ou de sauvegarde.

Ici mon probleme vient je pense du fait que j'utilise une "classe de chargement", c'est à dire que j'ai une classe qui charge les texture, les fichiers textes de sauvegarde ou de langue, les musiques... etc... au lancement du programme, cette classe de chargement n'étant instanciée qu'une seule fois. Ensuite cette classe passe ses attributs au différentes classe scène (comme Scene_MainMenu, Scene_OptionsMenu, Scene_Game...), qui s'en sert pour afficher des unités, des textes, de GUI... etc.
Je sais c'est pas très orthodoxe comme méthode mais sur le papier ça avait le mérite d'être pas trop compliqué et fonctionnel pour mon projet, l'objectif étant de reproduire et d'améliorer un peu une partie du moteur de jeu de Warcraft II.

Mais revenons à nos moutons! J'ai donc un problème d'affichage de sf::text lorsque j'utilise la méthode la classe de chargement (pourtant je n'ai aucun problème lorsque j'utilise des textures et des sprites).

Pour indication:
je code en C++
j'utilise Code:Blocks
j'utilise SFML 2.1

Tout d'abord je créé un sf::String dans la classe Scene_Loading pour le garder en mémoire de cette manière:
 
//Dans le constructeur de Scene_Loading              
locale local;
m_StringNewGame = String("Nouvelle partie", local);
 

Ensuite je cherche de la même manière un sf::font:
//Toujours dans le constructeur de Scene_Loading
if(!m_Font1.loadFromFile("Ressources/Font/arial.ttf"))
{
      //Erreur
      cout << "Fail dans le loading de arial.ttf" << endl;
}
 

Maintenant que j'ai le sf::String et le sf::font dans la classe Scene_Loading (avec leur "getteur" correspondant), je créé un pointeur sur le sf::Text que je voudrais afficher dans le constructeur de la classe Scene_MainScreen (qui affiche et gère le menu principal du jeu) comme ceci:
Scene_MainScreen::Scene_MainScreen(Scene_Loading *Loaded)
{
    //D'autres bidouillage sur la taille de l'écran, des setScale()... etc...

    //Chargement des textes
    m_TextNewGame = new Text(Loaded->getStringNewGame(), Loaded->getFont1(), 50); //Construction du texte nouvelle partie à partir Scene_Loading chargée
    //D'autres texte basés sur le même principe

    //D'autres modif qui n'agissent pas sur le sf::Text ...
}
 

Ensuite, maintenant que j'ai chargé le sf::Text et la Scene_MainScreen, je la lance à l'aide de la méthode LaunchMainScreen(RenderWindow *App) qui reprend la boucle 'infinie' du jeu:
 void Scene_MainScreen::LaunchMainScreen(RenderWindow *App)
 {
    bool fin_MainScreen = false;

    //Tant qu'on est sur le mainScreen
    while(App->isOpen() && fin_MainScreen == false)
    {

        //Zone event
        sf::Event event;
        while (App->pollEvent(event))
        {
            //Conditions pour fermer la fenetre
            if (event.type == sf::Event::Closed || m_TextQuit->getGlobalBounds().contains(WorldPosition) ==  true)
            {
                App->close();
            }
        }

        App->clear(Color::Blue);
        App->draw(*m_TextNewGame);
        //D'autre draw(); ...
        App->display();

    }
 }
 

Voilà... Et bien là je n'ai aucune erreur de compilation (j'ai enlevé volontairement les morceaux de codes inutiles qui n'agissent pas sur le sf::text pour alléger la lecture  ;D), mais le code plante lorsque le programme arrive dans la Scene_MainScreen. Je n'arrive pas à isoler et gérer correctement l'erreur, c'est sans doute sous mes yeux mais je ne la vois pas comme d'habitude ^^. Je pense que c'est lors du passage du sf::font et du sf::String à la Scene_MainScreen.
Mon objectif est juste d'arriver à afficher correctement ce satané sf::Text! Mais cela ne veut absolument pas fonctionner dans mon code actuel  :( Si vous avez au moins une piste, pas forcément une solution miracle, je suis preneur!

En espérant que je ne vous ai pas trop embrouillé, et que j'ai été suffisamment compréhensible ^^
Voili voilu :)
Je m’excuse d'avance si il manque quoi que ce soit dans mes explications ou dans mon code! ^^'
« Modifié: Décembre 29, 2013, 02:00:43 pm par selandron »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème lors de l'utilisation de Sf::Text
« Réponse #1 le: Décembre 30, 2013, 12:36:32 am »
getFont1() renvoie une copie ou une référence ?
Si c'est une copie, elle est quasi immédiatement détruite et n'existe donc plus au moment où tu veux afficher ton Text.

selandron

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
    • E-mail
Re : Problème lors de l'utilisation de Sf::Text
« Réponse #2 le: Décembre 30, 2013, 11:01:33 am »
getFont1(); renvoie bien une copie effectivement...  :-X

Font Scene_Loading::getFont1()
{
    return m_Font1;
}
 

Donc il faudrait que cette fonction renvoie plutôt une référence sur cette sf::Font c'est ça?
« Modifié: Décembre 30, 2013, 11:15:25 am par selandron »

selandron

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
    • E-mail
Re : Problème lors de l'utilisation de Sf::Text
« Réponse #3 le: Décembre 30, 2013, 09:55:33 pm »
Bon j'ai résolu mon problème autrement :P

En fait c'était que la Scene_MainScreen se créait AVANT que police et écritures ne soient chargée par la Scene_Loading, tout bête, mais ça fait semaines que je travaillait dessus  :'(
M'enfin merci quand même :)