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
相关产品推荐
相关产品推荐

