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

SDL2与C++中使用SDL_ttf显示文本失败问题求助

SDL2 + SDL_ttf 文本不显示的问题修复

你的代码存在几个关键问题,导致文本无法正常显示,以下是对应的修复方案:

  • display 表面未初始化
    你将display设为了NULL,SDL_BlitSurface无法向空指针指向的表面绘制内容。需要把它替换为你创建的SDL窗口对应的表面,通过SDL_GetWindowSurface(window)获取(window是你的SDL_Window类型指针)。

  • 字体路径的转义错误
    C++字符串中,反斜杠\是转义字符,直接写"C:\Users\..."会被解析为无效字符,导致字体加载失败。需改为双反斜杠\\或正斜杠/:

    font = TTF_OpenFont("C:\\Users\\Owner\\source\\repos\\Project94\\Debug\\Arial.ttf", 12);
    // 或使用正斜杠更简洁
    font = TTF_OpenFont("C:/Users/Owner/source/repos/Project94/Debug/Arial.ttf", 12);
    
  • 未校验函数调用是否成功
    必须添加检查,确保字体、文本表面创建成功,避免空指针操作:

    font = TTF_OpenFont("C:/Users/Owner/source/repos/Project94/Debug/Arial.ttf", 12);
    if (!font) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "加载字体失败: %s", TTF_GetError());
        return 1;
    }
    text = TTF_RenderText_Solid(font, "Hello", text_color);
    if (!text) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "渲染文本失败: %s", TTF_GetError());
        TTF_CloseFont(font);
        return 1;
    }
    
  • 绘制后未更新屏幕
    调用SDL_BlitSurface后,必须执行SDL_UpdateWindowSurface(window),将表面内容刷新到屏幕,否则绘制的内容不会显示。

  • 未释放资源
    文本表面和字体使用完毕后要及时释放,避免内存泄漏:

    SDL_FreeSurface(text);
    TTF_CloseFont(font);
    

修复后的完整示例片段(假设已创建SDL窗口window):

SDL_Window* window = SDL_CreateWindow("Blackjack", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if (!window) {
    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建窗口失败: %s", SDL_GetError());
    return 1;
}
SDL_Surface* display = SDL_GetWindowSurface(window);

TTF_Font* font = TTF_OpenFont("C:/Users/Owner/source/repos/Project94/Debug/Arial.ttf", 12);
if (!font) {
    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "加载字体失败: %s", TTF_GetError());
    SDL_DestroyWindow(window);
    return 1;
}

SDL_Color text_color = {255, 255, 255};
SDL_Surface* text = TTF_RenderText_Solid(font, "Hello", text_color);
if (!text) {
    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "渲染文本失败: %s", TTF_GetError());
    TTF_CloseFont(font);
    SDL_DestroyWindow(window);
    return 1;
}

// 指定绘制位置为左上角(10,10)
SDL_Rect dest_rect = {10, 10, text->w, text->h};
SDL_BlitSurface(text, NULL, display, &dest_rect);

// 更新屏幕显示
SDL_UpdateWindowSurface(window);

// 可添加延迟查看效果,比如SDL_Delay(2000);

// 释放资源
SDL_FreeSurface(text);
TTF_CloseFont(font);
SDL_DestroyWindow(window);

内容的提问来源于stack exchange,提问作者gamer67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:33:15