SDL2 ttf eine Variable aktuell ausgeben



  • Hallo, ich habe keine Idee mehr wie ich das Anstellen soll das die aktuell Variable als Text auf dem Bildschirm ausgegeben wird ohne das mein Arbeitsspeicher sich langsam aber sicher verabschiedet.

    Meine Text Klasse:

    SDL_Text::SDL_Text(CSDL_Setup* passed_SDL_Setup, int x, int y, std::string textmake)
    {
    
    	textColor = { 255, 255, 255 };
    
    	new_renderer = passed_SDL_Setup;
    
    	font = TTF_OpenFont("image/font.ttf", 28);
    
    	rtexts.x = x;
    	rtexts.y = y;
    	message = TTF_RenderText_Solid(font, textmake.c_str(), textColor);
    
    	texts = SDL_CreateTextureFromSurface(new_renderer->LoadRenderer(), message);
    	SDL_QueryTexture(texts, NULL, NULL, &rtexts.w, &rtexts.h);
    }
    
    SDL_Text::~SDL_Text()
    {
    	delete font;
    	delete message;
    	SDL_DestroyTexture(texts);	
    }
    
    void SDL_Text::textdraw()
    {	
    	SDL_RenderCopy(new_renderer->LoadRenderer(), texts, NULL, &rtexts);
    }
    

    Also mein Klasse ist so geschrieben, das sie im Konstruktor alle Informationen bekommt, anders kann ich mir das aber auch nicht vorstellen denn sonnst lädt es ja permanent neu. Ich habe keine Idee mehr... Help.


  • Mod

    BlendaWassa schrieb:

    Hallo, ich habe keine Idee mehr wie ich das Anstellen soll das die aktuell Variable als Text auf dem Bildschirm ausgegeben wird ohne das mein Arbeitsspeicher sich langsam aber sicher verabschiedet.

    weshalb verabschiedet er sich genau?

    Also mein Klasse ist so geschrieben, das sie im Konstruktor alle Informationen bekommt, anders kann ich mir das aber auch nicht vorstellen denn sonnst lädt es ja permanent neu. Ich habe keine Idee mehr... Help.

    gerne, aber wobei genau? wenn du uns sagst wo es genau hackt, kann man dir besser helfen. ich bin z.B. kein SDL kenner und sehe aus dem source nicht wo da dein problem ist, du hingegen hast es ja geschrieben und weisst wo was passiert bzw schief geht.

    allgemein ist es akzeptabel dinge im konstruktor zu initialisieren. Es gilt als eleganter eine Init funktion zu haben, da diese einen wert zurueckliefert, aber fuers erste ist deine loesung von der c++ seite her ok.

    aber jetzt, wo genau ist das problem.



  • Was macht denn LoadRenderer()? Wird dort Speicher verbraten?



  • Initialisierst du alle Texte die du jemals brauchst am Anfang? Ist das das Problem?



  • Ok ich hätte es genauer beschreiben sollen. Ich will z.B. Geld auf dem Bildschirm ausgeben.

    In Game.h (keine Ahnung wie man diesen Vorgang nennt, aber ich lade und reserviere)

    private:
    int VMoney;
    int Temp;
    SDL_Text* IMoney;
    

    Temp benötige ich um mit to_string umzuwandeln (Ich behaupte mal ich mach es umständlich, aber egal.)

    Im Konstrukteur von Game.cpp

    VMoney = 100;
    Temp = std::to_string(VMoney);
    IMoney = new SDL_Text(csdl_setup, 124, 3, Temp );
    

    Im Mainloop nutze ich die Draw Funktion

    IMoney->textdraw();
    

    Aber thq69 hat das Problem schon erkannt, ich initialisiere alles am Anfang und der Wert ändert sich bei der Anzeige nicht mehr(ungewollt). Wie soll das aber auch anders gehen??



  • Dann schreib dir eine Funktion ChangeText(int x, int y, std::string textmake), in der du die interne Variablen (texts, rtexts) neu berechnest (also anstatt im Konstruktor).



  • Hey, habe das Problem gelöst. Die Idee mit einem Updater hatte ich auch (es unterscheidet sich diese Klasse nicht allzu sehr von meiner Sprite Klasse, wo ich das genau so gemacht habe) aber das Problem was das Surface das immer mehr Speicher in anspruch genommen hat("message"). Ich dachte mit

    delete message;
    

    wird der Speicher freigegeben, irgendwie nicht wirklich.

    Meine Erweiterung meiner TextKlasse für alle, die es interessiert.

    void SDL_Text::textupdate(bool one, std::string textmakeupdate)
    {
    	message = TTF_RenderText_Solid(font, textmakeupdate.c_str(), textColor);
    	texts = SDL_CreateTextureFromSurface(csdl_rendererm->GetRenderer(), message);
    	SDL_QueryTexture(texts, NULL, NULL, &rtexts.w, &rtexts.h);
    	textdraw();
    	clear();
    }
    
    void SDL_Text::clear()
    {
    	SDL_FreeSurface(message);//Wichtigste Zeile! Hier wird der Spreicher von der/die/das Surface freigegeben
    	SDL_DestroyTexture(texts);
    }
    

Anmelden zum Antworten