我正在使用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-> Draw();它会破坏原始的SDL_Texture,加载新文本,然后在屏幕上呈现它。
我的最终目标是将我的字体类设置为我从绘图功能中选择颜色和大小的位置。不知道从这一点上要检查什么..
有什么建议?想法?
这就是我得到的(这是我想要的)然后它崩溃了。
我设法让它运作起来。在SDL_ttf上搜索了一下之后,我意识到在我的FreeFont()函数中我正在清除SDL_Texture,但是我没有对TTF_Font做任何事情。
在该函数中添加这些行就可以了:
TTF_CloseFont(font);
font = NULL;