使用SDL2 TTF库无法在窗口显示文本的问题求助
问题分析与解决办法
你的代码存在几个关键错误导致文本无法显示,逐一修正如下:
1. 核心错误:纹理创建时机颠倒
你在初始化窗口和渲染器之前就调用了SDL_CreateTextureFromSurface(window1.renderer, textSurf),此时window1.renderer还未被初始化(值为NULL),直接导致纹理创建失败,自然无法显示文本。
修正方案:将字体、文本表面、纹理的创建代码,移到窗口和渲染器初始化之后:
// 先创建窗口与渲染器 window1.CreateWindow("Pix", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 600, SDL_WINDOW_BORDERLESS); window1.CreateRenderer(window1.window, -1, 0); // 再处理文本相关逻辑 TTF_Font* font = TTF_OpenFont("./acme.ttf", 10); SDL_Surface* textSurf = TTF_RenderText_Solid(font, "Hola mundo", {255,0,0}); SDL_Texture* textTexture = SDL_CreateTextureFromSurface(window1.renderer, textSurf);
2. 强制添加错误检查,排查潜在问题
SDL/SDL_ttf的函数很容易因路径、资源问题失败,添加检查能快速定位隐藏问题:
// 检查TTF初始化 if(TTF_Init() == -1) { cout << "TTF初始化失败: " << TTF_GetError() << endl; return 1; } // 检查字体加载 TTF_Font* font = TTF_OpenFont("./acme.ttf", 10); if(!font) { cout << "字体加载失败: " << TTF_GetError() << endl; TTF_Quit(); SDL_Quit(); return 1; } // 检查文本表面创建 SDL_Surface* textSurf = TTF_RenderText_Solid(font, "Hola mundo", {255,0,0}); if(!textSurf) { cout << "文本表面创建失败: " << TTF_GetError() << endl; TTF_CloseFont(font); TTF_Quit(); SDL_Quit(); return 1; } // 检查纹理创建 SDL_Texture* textTexture = SDL_CreateTextureFromSurface(window1.renderer, textSurf); if(!textTexture) { cout << "纹理创建失败: " << SDL_GetError() << endl; SDL_FreeSurface(textSurf); TTF_CloseFont(font); TTF_Quit(); SDL_Quit(); return 1; }
3. 规范渲染逻辑(可选但必要)
当前代码仅在初始化时渲染一次,若窗口被遮挡后恢复,会出现内容丢失。建议将渲染逻辑移入主循环:
while (running) { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { running = 0; } } // 清空窗口背景 window1.ChangeBackgroundColor(0xe0e0e0); // 绘制线条 drawLine(window1, 3, 3, 40, 50, 0x0aaf88, 0); drawLine(window1, 40, 50, 80, 3, 0x0aaf88, 0); drawLine(window1, 80, 3, 3, 3, 0x0aaf88, 0); // 渲染文本 SDL_RenderCopy(window1.renderer, textTexture, NULL, &textRect); // 更新窗口显示 SDL_RenderPresent(window1.renderer); }
4. 完善资源清理
程序结束前务必释放所有申请的资源:
SDL_DestroyTexture(textTexture); TTF_CloseFont(font);
额外注意事项
- 确认
./acme.ttf路径正确:若字体文件不在程序运行的工作目录,需改用绝对路径或调整文件位置。 - 当前字体大小设为10可能过小,建议尝试24以上的数值,更容易观察显示效果。
内容的提问来源于stack exchange,提问作者Nico Cano
相关产品推荐
相关产品推荐

