You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:30:55