-1

I'm using C++ with the SDL2 library to create a game. I'm using the SDL_ttf extension to be able to use ttf fonts and I'm trying to create my own class that would be more effective for multiple texts on the screen. The code I currently have starts out good, then crashes after about 15 seconds of running. I added more text and now it crashes after about 5 or 7 seconds. I'm looking for advice on how to solve this problem. my full Font class is as follows:

Font.h

#pragma once

#include "Graphics.h"
#include <string>

class Font
{
public:
    Font(std::string path, SDL_Renderer* renderer);
    ~Font();

    void FreeText();
    void LoadText(int size, RGB_COLOR color, std::string text);
    void Draw(int x, int y, Graphics& gfx, int size, RGB_COLOR color, std::string text);

private:
    int width,height;
    TTF_Font* font;
    SDL_Texture* mTexture;
    SDL_Renderer* renderer;
    std::string path;
};

Font.cpp

#include "Font.h"

Font::Font(std::string path, SDL_Renderer* renderer)
:
font(NULL),
mTexture(NULL),
renderer(renderer),
path(path)
{
    printf("Font con..\n");
}

Font::~Font()
{

}

void Font::LoadText(int size, RGB_COLOR color, std::string text)
{
    font = TTF_OpenFont(path.c_str(), size);
    SDL_Color c = {color.RED, color.GREEN, color.BLUE};
    SDL_Surface* loadedSurface = TTF_RenderText_Solid(font, text.c_str(), c);

    mTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface);
    width = loadedSurface->w;
    height = loadedSurface->h;

    SDL_FreeSurface(loadedSurface);
}

void Font::FreeText()
{
    SDL_DestroyTexture(mTexture);
    mTexture = NULL;
}

void Font::Draw(int x, int y, Graphics& gfx, int size, RGB_COLOR color, std::string text)
{
    FreeText();
    LoadText(size, color, text);

    SDL_Rect rect = {x, y, width * gfx.GetGameDims().SCALE, height * gfx.GetGameDims().SCALE};
    gfx.DrawTexture(mTexture, NULL, &rect);
}

My Graphics class just handles the actual drawing as well as dimensions of the game (screen size, tile size, color struct, gamestates, etc) So when I'm calling gfx.Draw it calls SDL_RenderCopy function.

Within my Game class I have a pointer to my Font class. (its called in my Game constructor) Then font->Draw() is called every frame; which destroys the original SDL_Texture, Loads the new text, then renders it on the screen.

My ultimate goal is to have my font class set up to where I choose the color and size from my draw function. Not sure what to check from this point on..

Any suggestions? Ideas?

enter image description here

This is what I get (which is what I want) but then it crashes.

Vince
  • 2,596
  • 11
  • 43
  • 76

1 Answers1

1

I've managed to get it working. After searching a little more on SDL_ttf, I realized that in my FreeFont() function I was clearing out the SDL_Texture, however I did nothing with the TTF_Font.

Adding these lines in that function did the trick:

TTF_CloseFont(font);
font = NULL;
Vince
  • 2,596
  • 11
  • 43
  • 76