我最近开始从使用 SDL (1.2.15) 迁移到 SDL2 (2.0.0),之前依赖于使用扩展库 SDL_ttf (2.0.11) 来渲染字体。当我尝试使用与版本一 SDL 和 SDL2(诚然尚未正式发布)一起使用的相同文本库时,它编译得很好。但是,当我运行可执行文件时(我目前正在使用 VS2012 for Desktop),我收到以下错误:
Unhandled exception at 0x6C7D8C24 (SDL2.dll) in test.exe: 0xC0000005: Access violation reading location 0x00000045.
据我所知,这是由于以下代码。我创建了一个 Window 类来封装一些常用的 SDL 函数:
窗口.cpp:
SDL_Texture* Window::RenderText(const std::string &message, const std::string &fontFile, SDL_Color color, int fontSize){
//Open the font
TTF_Font *font = nullptr;
font = TTF_OpenFont(fontFile.c_str(), fontSize);
if (font == nullptr)
throw std::runtime_error("Failed to load font: " + fontFile + TTF_GetError());
//Render the message to an SDL_Surface, as that's what TTF_RenderText_X returns
SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color);
SDL_Texture *texture = SDL_CreateTextureFromSurface(mRenderer.get(), surf);
//Clean up unneeded stuff
SDL_FreeSurface(surf);
TTF_CloseFont(font);
return texture;
}
它被绊倒了
SDL_Texture *texture = SDL_CreateTextureFromSurface(mRenderer.get(), surf);
行,其中创建的 SDL_Surface 与 SDL2 的 Surfaces 定义不兼容,因此当它尝试将 SDL_Surface 转换为 SDL_Texture 时,它会翻转。
我不认为我是唯一遇到此问题的人,那么是否有解决此问题的 SDL_ttf 的解决方法/更新版本,或者我应该推迟到 SDL2 直到我可以让字体工作?