自定义字体类崩溃游戏

时间:2018-03-02 06:40:48

标签: c++ sdl-2 sdl-ttf

我使用C ++和SDL2库来创建游戏。我使用SDL_ttf扩展程序可以使用ttf字体,我试图创建自己的类,这对于屏幕上的多个文本更有效。我目前的代码开始很好,然后在运行大约15秒后崩溃。我添加了更多文本,现在它在大约5或7秒后崩溃。我正在寻找有关如何解决这个问题的建议。我的完整Font类如下:

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类只处理实际绘图以及游戏尺寸(屏幕大小,平铺大小,颜色结构,游戏状态等)。因此,当我调用gfx.Draw时,它会调用SDL_RenderCopy函数。

在我的Game类中,我有一个指向我的Font类的指针。 (在我的游戏构造函数中调用)然后每帧调用font-&gt; Draw();它会破坏原始的SDL_Texture,加载新文本,然后在屏幕上呈现它。

我的最终目标是将我的字体类设置为我从绘图功能中选择颜色和大小的位置。不确定从这一点开始检查...

有什么建议吗?想法?

enter image description here

这就是我得到的(这就是我想要的)但随后崩溃了。

1 个答案:

答案 0 :(得分:1)

我设法让它发挥作用。在SDL_ttf上搜索了一下之后,我意识到在我的FreeFont()函数中我正在清除SDL_Texture,但是我没有对TTF_Font做任何事情。

在该函数中添加这些行可以解决问题:

TTF_CloseFont(font);
font = NULL;