Project, Text wird nicht gezeichnet



  • Naja ich mache es nach einem Tutorial. Ich habe alles Mehrmals überprüft doch bei mir ist der code genauso wie in dem tutorial.



  • MrBambi schrieb:

    Naja ich mache es nach einem Tutorial. Ich habe alles Mehrmals überprüft doch bei mir ist der code genauso wie in dem tutorial.

    Na dann lade mal gen ganzen Menü-Code wo hoch (als Zip wäre praktisch), und verlinke das Tutorial.

    Irgendwo muss ja der Fehler sein.



  • Okey, folgendes Beispiel:

    void Options::HandleEvents()
    {
    	if(mStateGuiManager->GetGUIObject("Options/BackToMenu")->isClicked() == true)
    	{
    		SetNextState("State/Menu");
    	}
    }
    void Options::EnterState()
    {
    
    	Button *OptionsToMenuButton    = new Button("Options/BackToMenu",   sf::Vector2f(100,100),sf::Vector2f(1,1),"Texture/ExitButton.png","Exit");
    	OptionsToMenuButton->setPosition(sf::Vector2f(800/2-OptionsToMenuButton->getSprite().getTextureRect().width/2,400));
    	mStateGuiManager->RegisterGUIObject(OptionsToMenuButton);
    
    }
    void Options::LeaveState()
    {
    	mStateGuiManager->ClearGUIObjects();
    	SetNextState("");
    }
    

    Das hier sagt doch jetzt, das eseinen Button gibt, welcher einen zurück ins Menü bringt. Auserdem sollte Exit draufstehen, tut es aber nicht.

    Mal noch ein Beispiel:

    sf::Font font;
    font.loadFromFile("arial.ttf");
    
    sf::Text text("TTTTEEEEESSSSTTTT!!!!!!!!!", font);
    text.setCharacterSize(30);
    text.setStyle(sf::Text::Bold);
    text.setColor(sf::Color::White);
    mMainStateWindow->draw(text);
    

    Hier sollte ebenfalls ein Text stehen, welcher nicht angezeigt wird. Die Datei arial.ttf wurde aber gefunde und geladen, andernfalls würde es in der Konsole stehen.



  • Clearst du zufällig das Fenster, nachdem du den Text zeichnest?
    Wird die Font auch wirklich geladen? Überprüfe Rückgabewert von loadFromFile.
    Versuch es mal mit anderen Fonts.
    Setze die Textfarbe mal auf Rot.
    Wrappe den Text-Render-Code zwischen mMainStateWindow->pushGLStates(); und mMainStateWindow->popGLStates();



  • Naja ich mache es nach einem Tutorial. Ich habe alles Mehrmals überprüft doch bei mir ist der code genauso wie in dem tutorial.



  • MrBambi schrieb:

    Naja ich mache es nach einem Tutorial. Ich habe alles Mehrmals überprüft doch bei mir ist der code genauso wie in dem tutorial.

    Hast du das ausprobiert was ich gepostet habe?



  • Oh tut mir Leid das ich dieselbe Nachricht nochmal geschrieben habe. Wollt ich nicht. Also:Textfarbe ändern hatnicht geholfen. Die Fonts können auch geladen werden. Alles überprüft. Aber ich weis leider nicht was genau du mit
    "Wrappe den Text-Render-Code zwischen mMainStateWindow->pushGLStates(); und mMainStateWindow->popGLStates();" meinst.



  • MrBambi schrieb:

    Aber ich weis leider nicht was genau du mit
    "Wrappe den Text-Render-Code zwischen mMainStateWindow->pushGLStates(); und mMainStateWindow->popGLStates();" meinst.

    Ok, "wrappe" war nicht das beste Wort:

    mMainStateWindow->pushGLStates();
    mMainStateWindow->draw(text);
    mMainStateWindow->popGLStates();
    


  • Naja jetzt siehts so aus:

    sf::Text text("TTTTEEEEESSSSTTTT!!!!!!!!!", font);
    text.setCharacterSize(30);
    text.setStyle(sf::Text::Bold);
    text.setColor(sf::Color::Red);
    mMainStateWindow->pushGLStates();
    mMainStateWindow->draw(text);
    mMainStateWindow->popGLStates();
    

    Nur jetzt ist das Fenster komplett leer.



  • Naja es ist wohl das Beste wenn ihr euch das ganze Projekt mal selbst anschaut.
    https://www.dropbox.com/s/buwm2l8xyfmjg9w/Projekt1.rar
    Ich bin mir jetzt nicht sicher, aber da man beim einbinden der SFML ja die ganzen Verzeichnisse auswählen muss, welche bei euch ja anders sind, kanns sein das man diese neu einbinden muss. Genau weis ich das aber nicht habs noch nie ausprobiert, erscheint mir aber Logisch. Mal zum Projekt: da ich am Schluss noch etwas experimentier habe, kanns sein das einige Sachen kommentiert sind, also nicht wundern. Auserdem, am Anfang wenn man das Projekt Releast, kommt man ins Menü. Drückt man auf den Button Options (Bei mir werden ja die Texte der Buttons nicht angezeigt, aber es ist der 2. von oben) kommt man in den State Options. Da hätte ich ganz oben mittig auch gerne den Text "Options". Hoofentlich kann mir nun jemand helfen.

    EDIT: Sorry das war das falsche Projekt. Man bin ich verplant 😃 Hier das richtige:
    https://www.dropbox.com/s/1cqqzp4czgwkegp/Chicken%20Attack.rar



  • MrBambi schrieb:

    EDIT: Sorry das war das falsche Projekt. Man bin ich verplant 😃 Hier das richtige:
    https://www.dropbox.com/s/1cqqzp4czgwkegp/Chicken%20Attack.rar

    Und jetzt erst habe ich es geschafft, das falsche Projekt zum kompilieren zu bringen. 👍
    Gab es irgendwelch Änderungen von Bedeutung? Habe jetzt ehrlich gesagt keine Lust, das ganze erneut von vorne zu machen.

    Und ja, Text sehe ich auch keinen. Mal schaun.



  • Naja beim ersten hab ich i.was gemacht dann konnte bei mir die projektmappe nimmer geöffnet werden. Das 2. war ne kopie wos noch ging. Aber ansonsten is es dasselbe.



  • Naja beim ersten hab ich i.was gemacht dann konnte bei mir die projektmappe nimmer geöffnet werden. Das 2. war ne kopie wos noch ging. Aber ansonsten is es dasselbe.



  • Ich hab nochmal was nachgeschaut. Es werden nichtmal die Text in einer Textbox angezeigt.



  • Fehler gefunden.

    Die ganzen GUI-Objekte (z.B. Button.cpp) haben zwar einen Text (mText), aber keine Font angegeben.

    Im Endeffekt fehlt in Button.cpp im Konstruktor ein mText.setFont(...); Aufruf.

    So sieht es bei mir aus.



  • DANKE! 😃
    Wie genau muss ich die Font jetzt laden?
    Ich hätte es so gemacht, einfach im Konstruktor

    sf::Font font;
    font.loadFromFile("arial.ttf");
    mText  .setFont(font);
    

    uu schreiben, aber da gibt es dann eine Zugriffsverletzung. Also wie hast du das gemacht? 🙂



  • MrBambi schrieb:

    DANKE! 😃
    Wie genau muss ich die Font jetzt laden?
    Ich hätte es so gemacht, einfach im Konstruktor

    sf::Font font;
    font.loadFromFile("arial.ttf");
    mText  .setFont(font);
    

    uu schreiben, aber da gibt es dann eine Zugriffsverletzung. Also wie hast du das gemacht? 🙂

    Die SFML Dokumentation sagt folgendes:

    It is important to note that the sf::Text instance doesn't copy the font that it uses, it only keeps a reference to it. Thus, a sf::Font must not be destructed while it is used by a sf::Text

    Heißt: Ein sf::Text Objekt kopiert die Font nicht, sondern speichert nur eine Referenz auf das Font Objekt. Daher wird wohl die Zugriffsverletzung kommen.
    Die Font muss also zur kompletten Lebenszeit von mText erhalten sein.

    Eine Lösung könnte so aussehen:

    /// GUIObject.hpp, ca. Zeile 44:
    // ...
    sf::Texture mTexture;
    sf::Sprite  mSprite;
    sf::Text    mText;
    bool        mActive;
    sf::Font    mFont;   // Neu!
    // ...
    
    /// GUIObject.cpp, ca. Zeile 12 (im Konstruktor):
    // ...
    {
        mFont.loadFromFile("arial.ttf");
        mText.setFont(mFont);
    }
    

    Das ist zwar nicht die Speicher-Effizienteste Art, da jedes GUIObject eine eigene Kopie der Font hat, aber das könnte man auch einfach lösen (Stichwort static).



  • Vielen Dank! Endlich funktioniert es 😃



  • Wow, ihr habt den Fehler gefunden.
    Aber Moment...

    hustbaer schrieb:

    And now to something etwas mehr hilfreich: setFont


Anmelden zum Antworten